-/* $Id: d1_doespec.c,v 1.11 2006-08-14 10:40:06 adam Exp $
- Copyright (C) 1995-2006
+/* $Id: d1_doespec.c,v 1.15 2007-05-08 12:50:03 adam Exp $
+ Copyright (C) 1995-2007
Index Data ApS
This file is part of the Zebra server.
*/
+/** \file d1_doespec.c
+ * \brief handle Z39.50 variant-1 specs
+ *
+ * See http://www.loc.gov/z3950/agency/defns/variant1.html
+ */
#include <assert.h>
#include <stdlib.h>
#include <yaz/log.h>
-#include <yaz/oid.h>
#include <yaz/proto.h>
+#include <yaz/oid_db.h>
#include <idzebra/data1.h>
static int match_children(data1_handle dh, data1_node *n,
* set is the set to look for, universal set is the set that applies to a
* triple with an unknown set.
*/
-static Z_Triple *find_triple(Z_Variant *var, oid_value universalset,
- oid_value set, int zclass, int type)
+static Z_Triple *find_triple(Z_Variant *var, const Odr_oid *universal_oid,
+ const Odr_oid *var_oid, int zclass, int type)
{
int i;
- oident *defaultsetent = oid_getentbyoid(var->globalVariantSetId);
- oid_value defaultset = defaultsetent ? defaultsetent->value :
- universalset;
for (i = 0; i < var->num_triples; i++)
{
- oident *cursetent =
- oid_getentbyoid(var->triples[i]->variantSetId);
- oid_value curset = cursetent ? cursetent->value : defaultset;
-
- if (set == curset &&
- *var->triples[i]->zclass == zclass &&
- *var->triples[i]->type == type)
+ const Odr_oid *cur_oid = var->triples[i]->variantSetId;
+ if (!cur_oid)
+ cur_oid = var->globalVariantSetId;
+ if (cur_oid && var_oid
+ && !oid_oidcmp(var_oid, cur_oid) && *var->triples[i]->type == type)
return var->triples[i];
}
return 0;
}
-static void match_triple (data1_handle dh, Z_Variant *vreq,
- oid_value defsetval,
- oid_value var1, data1_node *n)
+static void match_triple(data1_handle dh, Z_Variant *vreq,
+ const Odr_oid *def_oid,
+ const Odr_oid *var_oid, data1_node *n)
{
data1_node **c;
if ((*c)->u.variant.type->zclass->zclass == 4 &&
(*c)->u.variant.type->type == 1)
{
- if ((r = find_triple(vreq, defsetval, var1, 4, 1)) &&
+ if ((r = find_triple(vreq, def_oid, var_oid, 4, 1)) &&
(r->which == Z_Triple_internationalString))
{
const char *string_value =
}
else
{
- match_triple (dh, vreq, defsetval, var1, *c);
+ match_triple(dh, vreq, def_oid, var_oid, *c);
c = &(*c)->next;
}
}
Z_Variant *vreq =
e->elements[i]->u.simpleElement->variantRequest;
- oident *defset = oid_getentbyoid(e->defaultVariantSetId);
- oid_value defsetval = defset ? defset->value : VAL_NONE;
- oid_value var1 = oid_getvalbyname("Variant-1");
+ const Odr_oid *var_oid = yaz_oid_varset_variant_1;
if (!vreq)
vreq = e->defaultVariantRequest;
/*
* 6,5: meta-data requested, variant list.
*/
- if (find_triple(vreq, defsetval, var1, 6, 5))
+ if (find_triple(vreq, e->defaultVariantSetId,
+ var_oid, 6, 5))
show_variantlist = 1;
/*
* 9,1: Miscellaneous, no data requested.
*/
- if (find_triple(vreq, defsetval, var1, 9, 1))
+ if (find_triple(vreq, e->defaultVariantSetId,
+ var_oid, 9, 1))
no_data = 1;
/* howmuch */
- if ((r = find_triple(vreq, defsetval, var1, 5, 5)))
+ if ((r = find_triple(vreq, e->defaultVariantSetId,
+ var_oid, 5, 5)))
if (r->which == Z_Triple_integer)
get_bytes = *r->value.integer;
if (!show_variantlist)
- match_triple (dh, vreq, defsetval, var1, c);
+ match_triple(dh, vreq, e->defaultVariantSetId,
+ var_oid, c);
}
mark_subtree(c, show_variantlist, no_data, get_bytes, vreq,
select_flag);