/* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2008 Index Data
+ * Copyright (C) 1995-2009 Index Data
* See the file LICENSE for details.
*/
#include <yaz/z-core.h>
#include <yaz/wrbuf.h>
+static const char *lookup_index_from_string_attr(Z_AttributeList *attributes)
+{
+ int j;
+ int server_choice = 1;
+ for (j = 0; j < attributes->num_attributes; j++)
+ {
+ Z_AttributeElement *ae = attributes->attributes[j];
+ if (*ae->attributeType == 1) /* use attribute */
+ {
+ if (ae->which == Z_AttributeValue_complex)
+ {
+ Z_ComplexAttribute *ca = ae->value.complex;
+ int i;
+ for (i = 0; i < ca->num_list; i++)
+ {
+ Z_StringOrNumeric *son = ca->list[i];
+ if (son->which == Z_StringOrNumeric_string)
+ return son->u.string;
+ }
+ }
+ server_choice = 0; /* not serverChoice because we have use attr */
+ }
+ }
+ if (server_choice)
+ return "cql.serverChoice";
+ return 0;
+}
+
static int rpn2cql_attr(cql_transform_t ct,
Z_AttributeList *attributes, WRBUF w)
{
const char *relation = cql_lookup_reverse(ct, "relation.", attributes);
const char *index = cql_lookup_reverse(ct, "index.", attributes);
const char *structure = cql_lookup_reverse(ct, "structure.", attributes);
- if (index && strcmp(index, "index.cql.serverChoice"))
+
+ /* if transform (properties) do not match, we'll just use a USE
+ string attribute (bug #2978) */
+ if (!index)
+ index = lookup_index_from_string_attr(attributes);
+
+ if (!index)
{
- wrbuf_puts(w, index+6);
+ cql_transform_set_error(ct,
+ YAZ_BIB1_UNSUPP_USE_ATTRIBUTE, 0);
+ return -1;
+ }
+ /* for serverChoice we omit index+relation+structure */
+ if (strcmp(index, "cql.serverChoice"))
+ {
+ wrbuf_puts(w, index);
if (relation)
{
- relation += 9;
-
if (!strcmp(relation, "exact"))
relation = "==";
else if (!strcmp(relation, "eq"))
if (structure)
{
- structure += 10;
if (strcmp(structure, "*"))
{
wrbuf_puts(w, "/");
sterm = (const char *) term->u.general->buf;
break;
case Z_Term_numeric:
- wrbuf_printf(w, "%d", *term->u.numeric);
+ wrbuf_printf(w, ODR_INT_PRINTF, *term->u.numeric);
break;
case Z_Term_characterString:
sterm = term->u.characterString;
if (term)
{
- int i;
+ size_t i;
int must_quote = 0;
for (i = 0 ; i < lterm; i++)
if (sterm[i] == ' ')
/*
* Local variables:
* c-basic-offset: 4
+ * c-file-style: "Stroustrup"
* indent-tabs-mode: nil
* End:
* vim: shiftwidth=4 tabstop=8 expandtab