YAZ 5.35.1
logrpn.c
Go to the documentation of this file.
1/* This file is part of the YAZ toolkit.
2 * Copyright (C) Index Data
3 * See the file LICENSE for details.
4 */
9#if HAVE_CONFIG_H
10#include <config.h>
11#endif
12
13#include <stdio.h>
14#include <assert.h>
15
16#include <yaz/log.h>
17#include <yaz/logrpn.h>
18#include <yaz/oid_db.h>
19#include <yaz/proxunit.h>
20
21static const char *relToStr(Odr_int v)
22{
23 const char *str = 0;
24 switch (v)
25 {
26 case 1: str = "Less than"; break;
27 case 2: str = "Less than or equal"; break;
28 case 3: str = "Equal"; break;
29 case 4: str = "Greater or equal"; break;
30 case 5: str = "Greater than"; break;
31 case 6: str = "Not equal"; break;
32 case 100: str = "Phonetic"; break;
33 case 101: str = "Stem"; break;
34 case 102: str = "Relevance"; break;
35 case 103: str = "AlwaysMatches"; break;
36 }
37 return str;
38}
39
40static void attrStr(Odr_int type, Odr_int value, char *str)
41{
42 const char *rstr;
43 *str = '\0';
44 switch (type)
45 {
46 case 1:
47 sprintf(str, "use");
48 break;
49 case 2:
50 rstr = relToStr(value);
51 if (rstr)
52 sprintf(str, "relation=%s", rstr);
53 else
54 sprintf(str, "relation=" ODR_INT_PRINTF, value);
55 break;
56 case 3:
57 switch (value)
58 {
59 case 1:
60 sprintf(str, "position=First in field");
61 break;
62 case 2:
63 sprintf(str, "position=First in any subfield");
64 break;
65 case 3:
66 sprintf(str, "position=Any position in field");
67 break;
68 default:
69 sprintf(str, "position");
70 }
71 break;
72 case 4:
73 switch (value)
74 {
75 case 1:
76 sprintf(str, "structure=Phrase");
77 break;
78 case 2:
79 sprintf(str, "structure=Word");
80 break;
81 case 3:
82 sprintf(str, "structure=Key");
83 break;
84 case 4:
85 sprintf(str, "structure=Year");
86 break;
87 case 5:
88 sprintf(str, "structure=Date");
89 break;
90 case 6:
91 sprintf(str, "structure=Word list");
92 break;
93 case 100:
94 sprintf(str, "structure=Date (un)");
95 break;
96 case 101:
97 sprintf(str, "structure=Name (norm)");
98 break;
99 case 102:
100 sprintf(str, "structure=Name (un)");
101 break;
102 case 103:
103 sprintf(str, "structure=Structure");
104 break;
105 case 104:
106 sprintf(str, "structure=urx");
107 break;
108 case 105:
109 sprintf(str, "structure=free-form-text");
110 break;
111 case 106:
112 sprintf(str, "structure=document-text");
113 break;
114 case 107:
115 sprintf(str, "structure=local-number");
116 break;
117 case 108:
118 sprintf(str, "structure=string");
119 break;
120 case 109:
121 sprintf(str, "structure=numeric string");
122 break;
123 default:
124 sprintf(str, "structure");
125 }
126 break;
127 case 5:
128 switch (value)
129 {
130 case 1:
131 sprintf(str, "truncation=Right");
132 break;
133 case 2:
134 sprintf(str, "truncation=Left");
135 break;
136 case 3:
137 sprintf(str, "truncation=Left&right");
138 break;
139 case 100:
140 sprintf(str, "truncation=Do not truncate");
141 break;
142 case 101:
143 sprintf(str, "truncation=Process #");
144 break;
145 case 102:
146 sprintf(str, "truncation=re-1");
147 break;
148 case 103:
149 sprintf(str, "truncation=re-2");
150 break;
151 case 104:
152 sprintf(str, "truncation=CCL");
153 break;
154 default:
155 sprintf(str, "truncation");
156 }
157 break;
158 case 6:
159 switch(value)
160 {
161 case 1:
162 sprintf(str, "completeness=Incomplete subfield");
163 break;
164 case 2:
165 sprintf(str, "completeness=Complete subfield");
166 break;
167 case 3:
168 sprintf(str, "completeness=Complete field");
169 break;
170 default:
171 sprintf(str, "completeness");
172 }
173 break;
174 }
175 if (*str)
176 sprintf(str + strlen(str), " (" ODR_INT_PRINTF "=" ODR_INT_PRINTF")",
177 type, value);
178 else
179 sprintf(str, ODR_INT_PRINTF "=" ODR_INT_PRINTF, type, value);
180}
181
182/*
183 * zlog_attributes: print attributes of term
184 */
185static void zlog_attributes(Z_AttributesPlusTerm *t, int depth,
186 const Odr_oid *ast, int loglevel)
187{
188 int of, i;
189 char str[80];
190 int num_attributes = t->attributes->num_attributes;
191
192 for (of = 0; of < num_attributes; of++)
193 {
194 char attset_name_buf[OID_STR_MAX];
195 const char *attset_name = 0;
196 Z_AttributeElement *element;
197 element = t->attributes->attributes[of];
198 if (element->attributeSet)
199 {
200 attset_name = yaz_oid_to_string_buf(element->attributeSet,
201 0, attset_name_buf);
202 }
203 if (!attset_name)
204 attset_name = "";
205 switch (element->which)
206 {
208 attrStr(*element->attributeType,
209 *element->value.numeric, str);
210 yaz_log(loglevel, "%*.0s%s %s", depth, "", attset_name, str);
211 break;
213 yaz_log(loglevel, "%*.0s%s attributeType=" ODR_INT_PRINTF
214 " complex",
215 depth, "", attset_name, *element->attributeType);
216 for (i = 0; i<element->value.complex->num_list; i++)
217 {
218 if (element->value.complex->list[i]->which ==
220 yaz_log(loglevel, "%*.0s string: '%s'", depth, "",
221 element->value.complex->list[i]->u.string);
222 else if (element->value.complex->list[i]->which ==
224 yaz_log(loglevel, "%*.0s numeric: '" ODR_INT_PRINTF
225 " '", depth, "",
226 *element->value.complex->list[i]->u.numeric);
227 }
228 break;
229 default:
230 yaz_log(loglevel, "%.*s%s attribute unknown",
231 depth, "", attset_name);
232 }
233 }
234}
235
237{
238 switch (op->which)
239 {
240 case Z_Operator_and:
241 return "and";
242 case Z_Operator_or:
243 return "or";
245 return "not";
246 case Z_Operator_prox:
247 return "prox";
248 default:
249 return "unknown complex operator";
250 }
251}
252
254{
256 return "private";
257 const char *n = z_ProxUnit_to_str(*op->u.known);
258 if (n)
259 return n;
260 return "unknown";
261}
262
263static void zlog_structure(Z_RPNStructure *zs, int depth,
264 const Odr_oid *ast, int loglevel)
265{
266 if (zs->which == Z_RPNStructure_complex)
267 {
268 Z_Operator *op = zs->u.complex->roperator;
269 switch (op->which)
270 {
271 case Z_Operator_and:
272 case Z_Operator_or:
274 yaz_log(loglevel, "%*.0s %s", depth, "", complex_op_name(op) );
275 break;
276 case Z_Operator_prox:
277 yaz_log(loglevel, "%*.0s prox excl=%s dist=" ODR_INT_PRINTF
278 " order=%s "
279 "rel=%s unit=%s",
280 depth, "", op->u.prox->exclusion ?
281 (*op->u.prox->exclusion ? "T" : "F") : "N",
282 *op->u.prox->distance,
283 *op->u.prox->ordered ? "T" : "F",
286 break;
287 default:
288 yaz_log(loglevel, "%*.0s unknown complex", depth, "");
289 return;
290 }
291 zlog_structure(zs->u.complex->s1, depth+2, ast, loglevel);
292 zlog_structure(zs->u.complex->s2, depth+2, ast, loglevel);
293 }
294 else if (zs->which == Z_RPNStructure_simple)
295 {
296 if (zs->u.simple->which == Z_Operand_APT)
297 {
299
300 switch (zapt->term->which)
301 {
302 case Z_Term_general:
303 yaz_log(loglevel, "%*.0s term '%.*s' (general)", depth, "",
304 zapt->term->u.general->len,
305 zapt->term->u.general->buf);
306 break;
308 yaz_log(loglevel, "%*.0s term '%s' (string)", depth, "",
309 zapt->term->u.characterString);
310 break;
311 case Z_Term_numeric:
312 yaz_log(loglevel, "%*.0s term '" ODR_INT_PRINTF
313 "' (numeric)", depth, "",
314 *zapt->term->u.numeric);
315 break;
316 case Z_Term_null:
317 yaz_log(loglevel, "%*.0s term (null)", depth, "");
318 break;
319 default:
320 yaz_log(loglevel, "%*.0s term (not general)", depth, "");
321 }
322 zlog_attributes(zapt, depth+2, ast, loglevel);
323 }
324 else if (zs->u.simple->which == Z_Operand_resultSetId)
325 {
326 yaz_log(loglevel, "%*.0s set '%s'", depth, "",
327 zs->u.simple->u.resultSetId);
328 }
329 else
330 yaz_log(loglevel, "%*.0s unknown simple structure", depth, "");
331 }
332 else
333 yaz_log(loglevel, "%*.0s unknown structure", depth, "");
334}
335
336void log_rpn_query_level(int loglevel, Z_RPNQuery *rpn)
337{
338 zlog_structure(rpn->RPNStructure, 0, rpn->attributeSetId, loglevel);
339}
340
342{
344}
345
346void log_scan_term_level(int loglevel,
347 Z_AttributesPlusTerm *zapt, const Odr_oid *ast)
348{
349 int depth = 0;
350 if (!loglevel)
351 return;
352 if (zapt->term->which == Z_Term_general)
353 {
354 yaz_log(loglevel, "%*.0s term '%.*s' (general)", depth, "",
355 zapt->term->u.general->len, zapt->term->u.general->buf);
356 }
357 else
358 yaz_log(loglevel, "%*.0s term (not general)", depth, "");
359 zlog_attributes(zapt, depth+2, ast, loglevel);
360}
361
363{
364 log_scan_term_level(YLOG_LOG, zapt, ast);
365}
366
367void yaz_log_zquery_level(int loglevel, Z_Query *q)
368{
369 if (!loglevel)
370 return;
371 switch (q->which)
372 {
374 log_rpn_query_level(loglevel, q->u.type_1);
375 break;
376 case Z_Query_type_2:
377 yaz_log(loglevel, "CCL: %.*s", q->u.type_2->len, q->u.type_2->buf);
378 break;
379 case Z_Query_type_100:
380 yaz_log(loglevel, "Z39.58: %.*s", q->u.type_100->len,
381 q->u.type_100->buf);
382 break;
383 case Z_Query_type_104:
384 if (q->u.type_104->which == Z_External_CQL)
385 yaz_log(loglevel, "CQL: %s", q->u.type_104->u.cql);
386 }
387}
388
393
394/*
395 * Local variables:
396 * c-basic-offset: 4
397 * c-file-style: "Stroustrup"
398 * indent-tabs-mode: nil
399 * End:
400 * vim: shiftwidth=4 tabstop=8 expandtab
401 */
402
enum l_file_type type
Definition log.c:47
void yaz_log(int level, const char *fmt,...)
Writes log message.
Definition log.c:487
Logging utility.
#define YLOG_LOG
log level: log (regular)
Definition log.h:48
void yaz_log_zquery(Z_Query *q)
Definition logrpn.c:389
void log_scan_term_level(int loglevel, Z_AttributesPlusTerm *zapt, const Odr_oid *ast)
Definition logrpn.c:346
void log_rpn_query(Z_RPNQuery *rpn)
Definition logrpn.c:341
void log_rpn_query_level(int loglevel, Z_RPNQuery *rpn)
Definition logrpn.c:336
void yaz_log_zquery_level(int loglevel, Z_Query *q)
Definition logrpn.c:367
static const char * relToStr(Odr_int v)
Definition logrpn.c:21
void log_scan_term(Z_AttributesPlusTerm *zapt, const Odr_oid *ast)
Definition logrpn.c:362
static void attrStr(Odr_int type, Odr_int value, char *str)
Definition logrpn.c:40
const char * yaz_prox_unit_name(Z_ProximityOperator *op)
Definition logrpn.c:253
static char * complex_op_name(Z_Operator *op)
Definition logrpn.c:236
static void zlog_attributes(Z_AttributesPlusTerm *t, int depth, const Odr_oid *ast, int loglevel)
Definition logrpn.c:185
static void zlog_structure(Z_RPNStructure *zs, int depth, const Odr_oid *ast, int loglevel)
Definition logrpn.c:263
Header for Z39.50 Query Printing.
#define ODR_INT_PRINTF
Definition odr.h:49
nmem_int_t Odr_int
Definition odr.h:47
const char * yaz_oid_to_string_buf(const Odr_oid *oid, oid_class *oclass, char *buf)
maps any OID to string (named or dot-notation)
Definition oid_db.c:99
Header for OID database.
short Odr_oid
Definition oid_util.h:42
#define OID_STR_MAX
Definition oid_util.h:40
const char * z_ProxUnit_to_str(int u)
converts prox unit integer to string
Definition proxunit.c:33
Header for JSON functions.
#define Z_External_CQL
Definition prt-ext.h:93
union Z_AttributeElement::@50 value
Odr_int * attributeType
Definition z-core.h:581
Z_ComplexAttribute * complex
Definition z-core.h:585
Z_AttributeSetId * attributeSet
Definition z-core.h:580
Odr_int * numeric
Definition z-core.h:584
int num_attributes
Definition z-core.h:532
Z_AttributeElement ** attributes
Definition z-core.h:533
Z_AttributeList * attributes
Definition z-core.h:522
Z_StringOrNumeric ** list
Definition z-core.h:574
Z_RPNStructure * s2
Definition z-core.h:495
Z_Operator * roperator
Definition z-core.h:496
Z_RPNStructure * s1
Definition z-core.h:494
Z_InternationalString * cql
Definition prt-ext.h:138
int which
Definition prt-ext.h:63
union Z_External::@27 u
union Z_Operand::@47 u
Z_ResultSetId * resultSetId
Definition z-core.h:513
int which
Definition z-core.h:510
Z_AttributesPlusTerm * attributesPlusTerm
Definition z-core.h:512
union Z_Operator::@49 u
int which
Definition z-core.h:559
Z_ProximityOperator * prox
Definition z-core.h:564
Odr_bool * ordered
Definition z-core.h:594
Odr_int * distance
Definition z-core.h:593
Z_ProxUnit * known
Definition z-core.h:604
Odr_int * relationType
Definition z-core.h:601
Odr_bool * exclusion
Definition z-core.h:592
union Z_ProximityOperator::@51 u
Z_External * type_104
Definition z-core.h:477
Z_RPNQuery * type_1
Definition z-core.h:472
Odr_oct * type_2
Definition z-core.h:473
int which
Definition z-core.h:469
Odr_oct * type_100
Definition z-core.h:474
union Z_Query::@45 u
Z_AttributeSetId * attributeSetId
Definition z-core.h:489
Z_RPNStructure * RPNStructure
Definition z-core.h:490
Z_Complex * complex
Definition z-core.h:503
union Z_RPNStructure::@46 u
Z_Operand * simple
Definition z-core.h:502
union Z_StringOrNumeric::@72 u
Odr_int * numeric
Definition z-core.h:1322
Z_InternationalString * string
Definition z-core.h:1321
Odr_oct * general
Definition z-core.h:539
union Z_Term::@48 u
Z_InternationalString * characterString
Definition z-core.h:541
int which
Definition z-core.h:537
Odr_int * numeric
Definition z-core.h:540
int len
Definition odr.h:102
char * buf
Definition odr.h:101
#define Z_AttributeValue_numeric
Definition z-core.h:586
#define Z_Operator_and_not
Definition z-core.h:567
#define Z_Operator_or
Definition z-core.h:566
#define Z_Term_characterString
Definition z-core.h:549
#define Z_StringOrNumeric_numeric
Definition z-core.h:1324
#define Z_Operand_APT
Definition z-core.h:515
#define Z_ProximityOperator_known
Definition z-core.h:606
#define Z_AttributeValue_complex
Definition z-core.h:587
#define Z_Term_general
Definition z-core.h:547
#define Z_StringOrNumeric_string
Definition z-core.h:1323
#define Z_Query_type_1
Definition z-core.h:479
#define Z_Operator_prox
Definition z-core.h:568
#define Z_Query_type_101
Definition z-core.h:482
#define Z_Operand_resultSetId
Definition z-core.h:516
#define Z_RPNStructure_complex
Definition z-core.h:505
#define Z_Operator_and
Definition z-core.h:565
#define Z_Term_numeric
Definition z-core.h:548
#define Z_RPNStructure_simple
Definition z-core.h:504
#define Z_Term_null
Definition z-core.h:554
#define Z_Query_type_104
Definition z-core.h:484
#define Z_Query_type_100
Definition z-core.h:481
#define Z_Query_type_2
Definition z-core.h:480