1 /* This file is part of the YAZ toolkit.
2 * Copyright (C) 1995-2011 Index Data
3 * See the file LICENSE for details.
5 /** \file querytowrbuf.c
6 \brief Convert Z39.50 Z_Query to PQF (as WRBUF string)
15 #include <yaz/logrpn.h>
16 #include <yaz/querytowrbuf.h>
17 #include <yaz/oid_db.h>
19 void yaz_encode_pqf_term(WRBUF b, const char *term, int len)
22 for (i = 0; i < len; i++)
23 if (strchr(" \"{", term[i]))
25 if (len > 0 && i == len)
27 for (i = 0; i<len; i++)
31 wrbuf_putc(b, term[i]);
37 for (i = 0; i<len; i++)
39 if (term[i] == '"' || term[i] == '\\')
41 wrbuf_putc(b, term[i]);
48 static void yaz_attribute_element_to_wrbuf(WRBUF b,
49 const Z_AttributeElement *element)
53 wrbuf_puts(b, "@attr ");
54 if (element->attributeSet)
56 char oid_name_str[OID_STR_MAX];
57 const char *setname = yaz_oid_to_string_buf(element->attributeSet,
61 wrbuf_puts(b, setname);
65 wrbuf_printf(b, ODR_INT_PRINTF "=", *element->attributeType);
66 switch (element->which)
68 case Z_AttributeValue_numeric:
69 wrbuf_printf(b, ODR_INT_PRINTF, *element->value.numeric);
71 case Z_AttributeValue_complex:
72 for (i = 0; i<element->value.complex->num_list; i++)
76 if (element->value.complex->list[i]->which ==
77 Z_StringOrNumeric_string)
78 wrbuf_puts(b, element->value.complex->list[i]->u.string);
79 else if (element->value.complex->list[i]->which ==
80 Z_StringOrNumeric_numeric)
81 wrbuf_printf(b, ODR_INT_PRINTF,
82 *element->value.complex->list[i]->u.numeric);
86 wrbuf_puts(b, "@attr 1=unknown");
91 static const char *complex_op_name(const Z_Operator *op)
99 case Z_Operator_and_not:
101 case Z_Operator_prox:
104 return "unknown complex operator";
108 static void yaz_apt_to_wrbuf(WRBUF b, const Z_AttributesPlusTerm *zapt)
110 int num_attributes = zapt->attributes->num_attributes;
112 for (i = 0; i<num_attributes; i++)
113 yaz_attribute_element_to_wrbuf(b,zapt->attributes->attributes[i]);
115 switch (zapt->term->which)
118 yaz_encode_pqf_term(b, (const char *)zapt->term->u.general->buf,
119 zapt->term->u.general->len);
121 case Z_Term_characterString:
122 wrbuf_puts(b, "@term string ");
123 yaz_encode_pqf_term(b, zapt->term->u.characterString,
124 strlen(zapt->term->u.characterString));
127 wrbuf_printf(b, "@term numeric " ODR_INT_PRINTF " ",
128 *zapt->term->u.numeric);
131 wrbuf_puts(b, "@term null x");
134 wrbuf_printf(b, "@term null unknown%d ", zapt->term->which);
138 static void yaz_rpnstructure_to_wrbuf(WRBUF b, const Z_RPNStructure *zs)
140 if (zs->which == Z_RPNStructure_complex)
142 Z_Operator *op = zs->u.complex->roperator;
143 wrbuf_printf(b, "@%s ", complex_op_name(op) );
144 if (op->which== Z_Operator_prox)
146 if (!op->u.prox->exclusion)
148 else if (*op->u.prox->exclusion)
153 wrbuf_printf(b, " " ODR_INT_PRINTF " %d "
154 ODR_INT_PRINTF " ", *op->u.prox->distance,
155 *op->u.prox->ordered,
156 *op->u.prox->relationType);
158 switch(op->u.prox->which)
160 case Z_ProximityOperator_known:
163 case Z_ProximityOperator_private:
167 wrbuf_printf(b, "%d", op->u.prox->which);
169 if (op->u.prox->u.known)
170 wrbuf_printf(b, " " ODR_INT_PRINTF " ", *op->u.prox->u.known);
172 wrbuf_printf(b, " 0 ");
174 yaz_rpnstructure_to_wrbuf(b,zs->u.complex->s1);
175 yaz_rpnstructure_to_wrbuf(b,zs->u.complex->s2);
177 else if (zs->which == Z_RPNStructure_simple)
179 if (zs->u.simple->which == Z_Operand_APT)
180 yaz_apt_to_wrbuf(b, zs->u.simple->u.attributesPlusTerm);
181 else if (zs->u.simple->which == Z_Operand_resultSetId)
183 wrbuf_printf(b, "@set ");
184 yaz_encode_pqf_term(b, zs->u.simple->u.resultSetId,
185 strlen(zs->u.simple->u.resultSetId));
188 wrbuf_puts(b, "(unknown simple structure)");
191 wrbuf_puts(b, "(unknown structure)");
194 void yaz_rpnquery_to_wrbuf(WRBUF b, const Z_RPNQuery *rpn)
196 if (rpn->attributeSetId)
198 char oid_name_str[OID_STR_MAX];
199 const char *oid_name = yaz_oid_to_string_buf(rpn->attributeSetId,
202 wrbuf_printf(b, "@attrset %s ", oid_name);
204 yaz_rpnstructure_to_wrbuf(b, rpn->RPNStructure);
208 void yaz_query_to_wrbuf(WRBUF b, const Z_Query *q)
215 case Z_Query_type_101:
216 wrbuf_puts(b,"RPN ");
217 yaz_rpnquery_to_wrbuf(b, q->u.type_1);
220 wrbuf_puts(b, "CCL ");
221 wrbuf_write(b, (const char *) q->u.type_2->buf, q->u.type_2->len);
223 case Z_Query_type_100:
224 wrbuf_puts(b, "Z39.58 ");
225 wrbuf_write(b, (const char *) q->u.type_100->buf, q->u.type_100->len);
227 case Z_Query_type_104:
228 if (q->u.type_104->which == Z_External_CQL)
230 wrbuf_puts(b, "CQL ");
231 wrbuf_puts(b, q->u.type_104->u.cql);
234 wrbuf_printf(b,"UNKNOWN type 104 query %d", q->u.type_104->which);
238 void yaz_scan_to_wrbuf(WRBUF b, const Z_AttributesPlusTerm *zapt,
239 const Odr_oid *attrbute_set)
241 /* should print attr set here */
242 wrbuf_puts(b, "RPN ");
243 yaz_apt_to_wrbuf(b, zapt);
246 void wrbuf_diags(WRBUF b, int num_diagnostics, Z_DiagRec **diags)
248 /* we only dump the first diag - that keeps the log cleaner. */
249 wrbuf_puts(b," ERROR ");
250 if (diags[0]->which != Z_DiagRec_defaultFormat)
251 wrbuf_puts(b,"(diag not in default format?)");
254 Z_DefaultDiagFormat *e=diags[0]->u.defaultFormat;
256 wrbuf_printf(b, ODR_INT_PRINTF " ",*e->condition);
258 wrbuf_puts(b, "?? ");
259 if ((e->which==Z_DefaultDiagFormat_v2Addinfo) && (e->u.v2Addinfo))
260 wrbuf_puts(b, e->u.v2Addinfo);
261 else if ((e->which==Z_DefaultDiagFormat_v3Addinfo) && (e->u.v3Addinfo))
262 wrbuf_puts(b, e->u.v3Addinfo);
270 * c-file-style: "Stroustrup"
271 * indent-tabs-mode: nil
273 * vim: shiftwidth=4 tabstop=8 expandtab