#include <yaz/wrbuf.h>
#include <yaz/logrpn.h> /* For yaz_prox_unit_name() */
-static const char *lookup_index_from_string_attr(Z_AttributeList *attributes)
+static const char *lookup_index_from_string_attr(Z_AttributeList *attributes,
+ Odr_int *numeric_value)
{
int j;
int server_choice = 1;
return son->u.string;
}
}
+ else if (ae->which == Z_AttributeValue_numeric)
+ {
+ *numeric_value = *ae->value.numeric;
+ }
server_choice = 0; /* not serverChoice because we have use attr */
}
}
const char *index = cql_lookup_reverse(ct, "index.", attributes);
const char *structure = cql_lookup_reverse(ct, "structure.", attributes);
- /* if transform (properties) do not match, we'll just use a USE string attribute (bug #2978) */
+ /* if transform (properties) do not match, we'll fall back
+ to string or report numeric attribute error */
if (!index)
- index = lookup_index_from_string_attr(attributes);
-
- /* Attempt to fix bug #2978: Look for a relation attribute */
+ {
+ Odr_int use_attribute = -1;
+ index = lookup_index_from_string_attr(attributes, &use_attribute);
+ if (!index)
+ {
+ wrbuf_rewind(w);
+ if (use_attribute != -1)
+ wrbuf_printf(w, ODR_INT_PRINTF, use_attribute);
+ return YAZ_BIB1_UNSUPP_USE_ATTRIBUTE;
+ }
+ }
if (!relation)
relation = lookup_relation_index_from_attr(attributes);
- if (!index)
- {
- wrbuf_rewind(w);
- return YAZ_BIB1_UNSUPP_USE_ATTRIBUTE;
- }
if (!relation)
relation = "=";
else if (!strcmp(relation, "exact"))
YAZ_CHECK(compare(ct, "@and @and a b @and c d", "(a and b) and (c and d)"));
YAZ_CHECK(compare(ct, "@attr 1=field abc", "field=abc"));
- YAZ_CHECK(compare2(ct, "@attr 1=4 abc", 0, 114)); /* should fail */
+ YAZ_CHECK(compare2(ct, "@attr 1=4 abc", "4", 114)); /* should fail */
cql_transform_define_pattern(ct, "index.title", "1=4");
YAZ_CHECK(compare(ct, "@attr 1=4 abc", "title=abc"));
/* Other */
YAZ_CHECK(compare(ct, "@attr 2=103 @attr 1=_ALLRECORDS 1", "cql.allRecords=1"));
- YAZ_CHECK(compare2(ct, "@attr 1=500 abc", 0, 114));
+ YAZ_CHECK(compare2(ct, "@attr 1=500 abc", "500", 114));
YAZ_CHECK(compare2(ct, "@attr 5=99 x", "99", 120));
cql_transform_close(ct);
wrbuf_destroy(w);