YAZ 5.37.0
srwutil.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 <stdlib.h>
14#include <assert.h>
15#include <yaz/srw.h>
16#include <yaz/matchstr.h>
17#include <yaz/base64.h>
18#include <yaz/yaz-iconv.h>
19#include <yaz/snprintf.h>
20#include "sru-p.h"
21
22#define MAX_SRU_PARAMETERS 30
23
25 const char *n, const char *v)
26{
27 if (n && v && *v != '\0')
28 {
29 while (*l)
30 l = &(*l)->next;
31 *l = (Z_SRW_extra_arg *) odr_malloc(odr, sizeof(**l));
32 (*l)->name = odr_strdup(odr, n);
33 (*l)->value = odr_strdup(odr, v);
34 (*l)->next = 0;
35 l = &(*l)->next;
36 }
37 return l;
38}
39
41 const char *n, Odr_int *v)
42{
43 if (v)
44 {
45 char str[32];
46 yaz_snprintf(str, sizeof str, ODR_INT_PRINTF, *v);
47 l = append_extra_arg(odr, l, n, str);
48 }
49 return l;
50}
51
52static char *yaz_decode_sru_dbpath_odr(ODR n, const char *uri, size_t len)
53{
54 return odr_strdupn(n, uri, len);
55}
56
57void yaz_encode_sru_dbpath_buf(char *dst, const char *db)
58{
59 assert(db);
60 *dst = '/';
61 strcpy(dst+1, db);
62}
63
64char *yaz_encode_sru_dbpath_odr(ODR out, const char *db)
65{
66 char *dst = odr_malloc(out, 3 * strlen(db) + 2);
68 return dst;
69}
70
71#if YAZ_HAVE_XML2
72const char *yaz_element_attribute_value_get(xmlNodePtr ptr,
73 const char *node_name,
74 const char *attribute_name)
75{
76 struct _xmlAttr *attr;
77 if (strcmp((const char*) ptr->name, node_name))
78 return 0;
79 for (attr = ptr->properties; attr; attr = attr->next)
80 if (attr->children && attr->children->type == XML_TEXT_NODE)
81 {
82 if (!strcmp((const char *) attr->name, attribute_name))
83 return (const char *) attr->children->content;
84 }
85 return 0;
86}
87#endif
88
90{
91 const char *content_type = z_HTTP_header_lookup(hres->headers,
92 "Content-Type");
93 if (content_type)
94 {
95 if (!yaz_strcmp_del("text/xml", content_type, "; "))
96 return 1;
97 if (!yaz_strcmp_del("application/xml", content_type, "; "))
98 return 1;
99 if (!yaz_strcmp_del("application/sru+xml", content_type, "; "))
100 return 1;
101 }
102 return 0;
103}
104
110 char *username, char *password, ODR decode)
111{
112 const char *basic = z_HTTP_header_lookup(hreq->headers, "Authorization");
113
114 if (username)
115 sr->username = username;
116 if (password)
117 sr->password = password;
118
119 if (basic)
120 {
121 int len;
122 char out[256];
123 char ubuf[256] = "", pbuf[256] = "", *p;
124 if (strncmp(basic, "Basic ", 6))
125 return;
126 basic += 6;
127 len = strlen(basic);
128 if (!len || len > 256)
129 return;
130 yaz_base64decode(basic, out);
131 /* Format of out should be username:password at this point */
132 strcpy(ubuf, out);
133 if ((p = strchr(ubuf, ':')))
134 {
135 *(p++) = '\0';
136 if (*p)
137 strcpy(pbuf, p);
138 }
139 if (*ubuf)
140 sr->username = odr_strdup(decode, ubuf);
141 if (*pbuf)
142 sr->password = odr_strdup(decode, pbuf);
143 }
144}
145
147 const char *uri, const char *message,
148 const char *details)
149{
150 d->uri = odr_strdup(o, uri);
151 if (message)
152 d->message = odr_strdup(o, message);
153 else
154 d->message = 0;
155 if (details)
156 d->details = odr_strdup(o, details);
157 else
158 d->details = 0;
159}
160
162 int code, const char *details)
163{
164 char uri[40];
165
166 yaz_snprintf(uri, sizeof uri, "info:srw/diagnostic/1/%d", code);
167 yaz_mk_srw_diagnostic(o, d, uri, 0, details);
168}
169
171 int *num, const char *uri,
172 const char *message, const char *details)
173{
174 Z_SRW_diagnostic *d_new;
175 d_new = (Z_SRW_diagnostic *) odr_malloc(o, (*num + 1)* sizeof(**d));
176 if (*num)
177 memcpy(d_new, *d, *num *sizeof(**d));
178 *d = d_new;
179
180 yaz_mk_srw_diagnostic(o, *d + *num, uri, message, details);
181 (*num)++;
182}
183
185 int *num, int code, const char *addinfo)
186{
187 char uri[40];
188
189 yaz_snprintf(uri, sizeof uri, "info:srw/diagnostic/1/%d", code);
190 yaz_add_srw_diagnostic_uri(o, d, num, uri, 0, addinfo);
191}
192
193
195 int *num, int code, const char *addinfo)
196{
197 char uri[40];
198
199 yaz_snprintf(uri, sizeof uri, "info:srw/diagnostic/12/%d", code);
200 yaz_add_srw_diagnostic_uri(o, d, num, uri, 0, addinfo);
201}
202
203
204void yaz_mk_sru_surrogate(ODR o, Z_SRW_record *record, int pos,
205 int code, const char *details)
206{
207 const char *message = yaz_diag_srw_str(code);
208 int len = 200;
209 if (message)
210 len += strlen(message);
211 if (details)
212 len += strlen(details);
213
214 record->recordData_buf = (char *) odr_malloc(o, len);
215
216 yaz_snprintf(record->recordData_buf, len, "<diagnostic "
217 "xmlns=\"http://www.loc.gov/zing/srw/diagnostic/\">\n"
218 " <uri>info:srw/diagnostic/1/%d</uri>\n", code);
219 if (details)
220 yaz_snprintf(record->recordData_buf + strlen(record->recordData_buf),
221 len - strlen(record->recordData_buf), " <details>%s</details>\n", details);
222 if (message)
223 yaz_snprintf(record->recordData_buf + strlen(record->recordData_buf),
224 len - strlen(record->recordData_buf), " <message>%s</message>\n", message);
225 yaz_snprintf(record->recordData_buf + strlen(record->recordData_buf),
226 len - strlen(record->recordData_buf), "</diagnostic>\n");
227 record->recordData_len = strlen(record->recordData_buf);
228 record->recordPosition = odr_intdup(o, pos);
229 record->recordSchema = "info:srw/schema/1/diagnostics-v1.1";
230}
231
232static void grab_charset(ODR o, const char *content_type, char **charset)
233{
234 if (charset)
235 {
236 const char *charset_p = 0;
237 if (content_type && (charset_p = strstr(content_type, "; charset=")))
238 {
239 int j = 0, i = 0;
240 int sep = 0;
241 charset_p += 10; /* skip ; charset= */
242 if (charset_p[i] == '"' || charset_p[i] == '\'')
243 sep = charset_p[i++];
244 *charset = odr_strdup(o, charset_p);
245 while (charset_p[i] && charset_p[i] != sep)
246 {
247 if (!sep && strchr("; \n\r", charset_p[i]))
248 break;
249 if (charset_p[i] == '\\' && charset_p[i+1])
250 i++;
251 (*charset)[j++] = charset_p[i++];
252 }
253 (*charset)[j] = '\0';
254 }
255 }
256}
257
259 Z_SOAP **soap_package, ODR decode, char **charset)
260{
261 if (!strcmp(hreq->method, "POST"))
262 {
263 const char *content_type = z_HTTP_header_lookup(hreq->headers,
264 "Content-Type");
265 if (content_type &&
266 (!yaz_strcmp_del("text/xml", content_type, "; ") ||
267 !yaz_strcmp_del("application/soap+xml", content_type, "; ") ||
268 !yaz_strcmp_del("text/plain", content_type, "; ")))
269 {
270 char *db = "Default";
271 const char *p0 = hreq->path, *p1;
272 int ret = -1;
273
274 static Z_SOAP_Handler soap_handlers[5] = {
275#if YAZ_HAVE_XML2
280#endif
281 {0, 0, 0}
282 };
283
284 if (*p0 == '/')
285 p0++;
286 p1 = strchr(p0, '?');
287 if (!p1)
288 p1 = p0 + strlen(p0);
289 if (p1 != p0)
290 db = yaz_decode_sru_dbpath_odr(decode, p0, p1 - p0);
291
292 ret = z_soap_codec(decode, soap_package,
293 &hreq->content_buf, &hreq->content_len,
294 soap_handlers);
295 if (ret == 0 && (*soap_package)->which == Z_SOAP_generic)
296 {
297 *srw_pdu = (Z_SRW_PDU*) (*soap_package)->u.generic->p;
298 yaz_srw_decodeauth(*srw_pdu, hreq, 0, 0, decode);
299
300 /* last entry in handlers - SRU 2.0 - is turned into
301 offset 0.. due to other pieces relying on it */
302 if ((*soap_package)->u.generic->no == 3)
303 (*soap_package)->u.generic->no = 0;
304 if ((*srw_pdu)->which == Z_SRW_searchRetrieve_request &&
305 (*srw_pdu)->u.request->database == 0)
306 (*srw_pdu)->u.request->database = db;
307
308 if ((*srw_pdu)->which == Z_SRW_explain_request &&
309 (*srw_pdu)->u.explain_request->database == 0)
310 (*srw_pdu)->u.explain_request->database = db;
311
312 if ((*srw_pdu)->which == Z_SRW_scan_request &&
313 (*srw_pdu)->u.scan_request->database == 0)
314 (*srw_pdu)->u.scan_request->database = db;
315
316 if ((*srw_pdu)->which == Z_SRW_update_request &&
317 (*srw_pdu)->u.update_request->database == 0)
318 (*srw_pdu)->u.update_request->database = db;
319
320 return 0;
321 }
322 return 1;
323 }
324 }
325 return 2;
326}
327
328#if YAZ_HAVE_XML2
329static int yaz_sru_decode_integer(ODR odr, const char *pname,
330 const char *valstr, Odr_int **valp,
331 Z_SRW_diagnostic **diag, int *num_diag,
332 int min_value)
333{
334 int ival;
335 if (!valstr)
336 return 0;
337 if (sscanf(valstr, "%d", &ival) != 1)
338 {
339 yaz_add_srw_diagnostic(odr, diag, num_diag,
341 return 0;
342 }
343 if (min_value >= 0 && ival < min_value)
344 {
345 yaz_add_srw_diagnostic(odr, diag, num_diag,
347 return 0;
348 }
349 *valp = odr_intdup(odr, ival);
350 return 1;
351}
352#endif
353
358 Z_SOAP **soap_package, ODR decode, char **charset,
359 Z_SRW_diagnostic **diag, int *num_diag)
360{
361#if YAZ_HAVE_XML2
362 static Z_SOAP_Handler soap_handlers[2] = {
364 {0, 0, 0}
365 };
366#endif
367 const char *content_type = z_HTTP_header_lookup(hreq->headers,
368 "Content-Type");
369
370 /*
371 SRU GET: ignore content type.
372 SRU POST: we support "application/x-www-form-urlencoded";
373 not "multipart/form-data" .
374 */
375 if (!strcmp(hreq->method, "GET")
376 ||
377 (!strcmp(hreq->method, "POST") && content_type &&
378 !yaz_strcmp_del("application/x-www-form-urlencoded",
379 content_type, "; ")))
380 {
381 char *db = "Default";
382 const char *p0 = hreq->path, *p1;
383#if YAZ_HAVE_XML2
384 const char *operation = 0;
385 char *version = 0;
386 char *query = 0;
387 char *queryType = "cql";
388 char *username = 0;
389 char *password = 0;
390 char *sortKeys = 0;
391 char *stylesheet = 0;
392 char *scanClause = 0;
393 char *recordXPath = 0;
394 char *recordSchema = 0;
395 char *recordXMLEscaping = 0;
396 char *recordPacking = 0;
397 char *maximumRecords = 0;
398 char *startRecord = 0;
399 char *maximumTerms = 0;
400 char *responsePosition = 0;
401 const char *facetLimit = 0;
402 const char *facetStart = 0;
403 const char *facetSort = 0;
404 Z_SRW_extra_arg *extra_args = 0;
405#endif
406 char **uri_name;
407 char **uri_val;
408
409 grab_charset(decode, content_type, charset);
410 if (charset && *charset == 0 && !strcmp(hreq->method, "GET"))
411 *charset = "UTF-8";
412
413 if (*p0 == '/')
414 p0++;
415 p1 = strchr(p0, '?');
416 if (!p1)
417 p1 = p0 + strlen(p0);
418 if (p1 != p0)
419 db = yaz_decode_sru_dbpath_odr(decode, p0, p1 - p0);
420 if (!strcmp(hreq->method, "POST") && hreq->content_buf)
421 p1 = hreq->content_buf;
422 yaz_uri_to_array(p1, decode, &uri_name, &uri_val);
423#if YAZ_HAVE_XML2
424 if (uri_name)
425 {
426 int i;
427 for (i = 0; uri_name[i]; i++)
428 {
429 char *n = uri_name[i];
430 char *v = uri_val[i];
431 if (!strcmp(n, "query"))
432 query = v;
433 else if (!strcmp(n, "x-pquery"))
434 {
435 query = v;
436 queryType = "pqf";
437 }
438 else if (!strcmp(n, "queryType"))
439 queryType = v;
440 else if (!strcmp(n, "x-username"))
441 username = v;
442 else if (!strcmp(n, "x-password"))
443 password = v;
444 else if (!strcmp(n, "operation"))
445 operation = v;
446 else if (!strcmp(n, "stylesheet"))
447 stylesheet = v;
448 else if (!strcmp(n, "sortKeys"))
449 sortKeys = v;
450 else if (!strcmp(n, "recordXPath"))
451 recordXPath = v;
452 else if (!strcmp(n, "recordSchema"))
453 recordSchema = v;
454 else if (!strcmp(n, "recordPacking"))
455 recordPacking = v;
456 else if (!strcmp(n, "recordXMLEscaping"))
457 recordXMLEscaping = v;
458 else if (!strcmp(n, "version"))
459 version = v;
460 else if (!strcmp(n, "scanClause"))
461 scanClause = v;
462 else if (!strcmp(n, "x-pScanClause"))
463 {
464 scanClause = v;
465 queryType = "pqf";
466 }
467 else if (!strcmp(n, "maximumRecords"))
468 maximumRecords = v;
469 else if (!strcmp(n, "startRecord"))
470 startRecord = v;
471 else if (!strcmp(n, "maximumTerms"))
472 maximumTerms = v;
473 else if (!strcmp(n, "responsePosition"))
474 responsePosition = v;
475 else if (!strcmp(n, "facetLimit"))
476 facetLimit = v;
477 else if (!strcmp(n, "facetStart"))
478 facetStart = v;
479 else if (!strcmp(n, "facetSort"))
480 facetSort = v;
481 else if (!strcmp(n, "extraRequestData"))
482 ; /* ignoring extraRequestData */
483 else if (n[0] == 'x' && n[1] == '-')
484 {
485 append_extra_arg(decode, &extra_args, n, v);
486 }
487 else
488 {
489 if (*num_diag < 10)
490 yaz_add_srw_diagnostic(decode, diag, num_diag,
492 }
493 }
494 }
495 if (!operation)
496 {
497 if (query)
498 operation = "searchRetrieve";
499 else if (scanClause)
500 operation = "scan";
501 else
502 operation = "explain";
503 }
504 version = yaz_negotiate_sru_version(version);
505
506 if (!version)
507 { /* negotiation failed. */
508 yaz_add_srw_diagnostic(decode, diag, num_diag,
510 version = "2.0";
511 }
512 if (!operation)
513 {
514 if (uri_name)
516 decode, diag, num_diag,
518 operation = "explain";
519 }
520 if (strcmp(version, "2.0"))
521 {
522 if (recordXMLEscaping)
523 {
524 yaz_add_srw_diagnostic(decode, diag, num_diag,
526 "recordXMLEscaping");
527
528 }
529 recordXMLEscaping = recordPacking;
530 recordPacking = "packed";
531 }
532 if (!recordXMLEscaping)
533 recordXMLEscaping = "xml";
534 if (!strcmp(operation, "searchRetrieve"))
535 {
537
538 sr->srw_version = version;
539 sr->extra_args = extra_args;
540 *srw_pdu = sr;
541 yaz_srw_decodeauth(sr, hreq, username, password, decode);
542
543 sr->u.request->queryType = queryType;
544 sr->u.request->query = query;
545
546 if (!query)
548 decode, diag, num_diag,
550
551 if (sortKeys)
552 {
554 sr->u.request->sort.sortKeys = sortKeys;
555 }
556 sr->u.request->recordXPath = recordXPath;
557 sr->u.request->recordSchema = recordSchema;
558 sr->u.request->recordPacking = recordXMLEscaping;
559 sr->u.request->packing = recordPacking;
560 sr->u.request->stylesheet = stylesheet;
562 &facetLimit, &facetStart, &facetSort);
563
564 yaz_sru_decode_integer(decode, "maximumRecords", maximumRecords,
566 diag, num_diag, 0);
567
568 yaz_sru_decode_integer(decode, "startRecord", startRecord,
569 &sr->u.request->startRecord,
570 diag, num_diag, 1);
571
572 sr->u.request->database = db;
573
574 (*soap_package) = (Z_SOAP *)
575 odr_malloc(decode, sizeof(**soap_package));
576 (*soap_package)->which = Z_SOAP_generic;
577
578 (*soap_package)->u.generic = (Z_SOAP_Generic *)
579 odr_malloc(decode, sizeof(*(*soap_package)->u.generic));
580
581 (*soap_package)->u.generic->p = sr;
582 (*soap_package)->u.generic->ns = soap_handlers[0].ns;
583 (*soap_package)->u.generic->no = 0;
584
585 (*soap_package)->ns = "SRU";
586
587 return 0;
588 }
589 else if (!strcmp(operation, "explain"))
590 {
591 /* Transfer SRU explain parameters to common struct */
592 /* http://www.loc.gov/standards/sru/explain/ */
593 /* http://zeerex.z3950.org/overview/ */
595
596 sr->srw_version = version;
597 sr->extra_args = extra_args;
598 yaz_srw_decodeauth(sr, hreq, username, password, decode);
599 *srw_pdu = sr;
600 sr->u.explain_request->recordPacking = recordXMLEscaping;
601 sr->u.explain_request->packing = recordPacking;
602 sr->u.explain_request->database = db;
603
604 sr->u.explain_request->stylesheet = stylesheet;
605
606 (*soap_package) = (Z_SOAP *)
607 odr_malloc(decode, sizeof(**soap_package));
608 (*soap_package)->which = Z_SOAP_generic;
609
610 (*soap_package)->u.generic = (Z_SOAP_Generic *)
611 odr_malloc(decode, sizeof(*(*soap_package)->u.generic));
612
613 (*soap_package)->u.generic->p = sr;
614 (*soap_package)->u.generic->ns = soap_handlers[0].ns;
615 (*soap_package)->u.generic->no = 0;
616
617 (*soap_package)->ns = "SRU";
618
619 return 0;
620 }
621 else if (!strcmp(operation, "scan"))
622 {
623 /* Transfer SRU scan parameters to common struct */
624 /* http://www.loc.gov/standards/sru/companionSpecs/scan.html */
626
627 sr->srw_version = version;
628 sr->extra_args = extra_args;
629 *srw_pdu = sr;
630 yaz_srw_decodeauth(sr, hreq, username, password, decode);
631
632 sr->u.scan_request->queryType = queryType;
633 sr->u.scan_request->scanClause = scanClause;
634
635 if (!scanClause)
637 decode, diag, num_diag,
639 sr->u.scan_request->database = db;
640
641 yaz_sru_decode_integer(decode, "maximumTerms",
642 maximumTerms,
644 diag, num_diag, 0);
645
646 yaz_sru_decode_integer(decode, "responsePosition",
647 responsePosition,
649 diag, num_diag, 0);
650
651 sr->u.scan_request->stylesheet = stylesheet;
652
653 (*soap_package) = (Z_SOAP *)
654 odr_malloc(decode, sizeof(**soap_package));
655 (*soap_package)->which = Z_SOAP_generic;
656
657 (*soap_package)->u.generic = (Z_SOAP_Generic *)
658 odr_malloc(decode, sizeof(*(*soap_package)->u.generic));
659
660 (*soap_package)->u.generic->p = sr;
661 (*soap_package)->u.generic->ns = soap_handlers[0].ns;
662 (*soap_package)->u.generic->no = 0;
663
664 (*soap_package)->ns = "SRU";
665
666 return 0;
667 }
668 else
669 {
670 /* unsupported operation ... */
671 /* Act as if we received a explain request and throw diagnostic. */
672
674
675 sr->srw_version = version;
676 *srw_pdu = sr;
677 sr->u.explain_request->recordPacking = recordPacking;
678 sr->u.explain_request->database = db;
679
680 sr->u.explain_request->stylesheet = stylesheet;
681
682 (*soap_package) = (Z_SOAP *)
683 odr_malloc(decode, sizeof(**soap_package));
684 (*soap_package)->which = Z_SOAP_generic;
685
686 (*soap_package)->u.generic = (Z_SOAP_Generic *)
687 odr_malloc(decode, sizeof(*(*soap_package)->u.generic));
688
689 (*soap_package)->u.generic->p = sr;
690 (*soap_package)->u.generic->ns = soap_handlers[0].ns;
691 (*soap_package)->u.generic->no = 0;
692
693 (*soap_package)->ns = "SRU";
694
695 yaz_add_srw_diagnostic(decode, diag, num_diag,
696 YAZ_SRW_UNSUPP_OPERATION, operation);
697 return 0;
698 }
699#else
700 return 1;
701#endif
702 }
703 return 2;
704}
705
707{
709 odr_malloc(o, sizeof(*res));
710
711 res->extraRecordData_buf = 0;
712 res->extraRecordData_len = 0;
713 res->recordIdentifier = 0;
714 return res;
715}
716
717
719{
720 Z_SRW_record *res = (Z_SRW_record *) odr_malloc(o, n * sizeof(*res));
721 int i;
722
723 for (i = 0; i<n; i++)
724 {
725 res[i].recordSchema = 0;
727 res[i].recordData_buf = 0;
728 res[i].recordData_len = 0;
729 res[i].recordPosition = 0;
730 }
731 return res;
732}
733
738
739static Z_SRW_PDU *yaz_srw_get_core_ver(ODR o, const char *version)
740{
741 Z_SRW_PDU *p = (Z_SRW_PDU *) odr_malloc(o, sizeof(*p));
742 p->srw_version = odr_strdup(o, version);
743 p->username = 0;
744 p->password = 0;
745 p->extra_args = 0;
748 return p;
749}
750
752{
753 return yaz_srw_get_core_ver(o, "2.0");
754}
755
757{
758 return yaz_srw_get_pdu(o, which, "2.0");
759}
760
761/* http://docs.oasis-open.org/search-ws/searchRetrieve/v1.0/os/schemas/sruResponse.xsd */
763{
764 int version2 = !req->srw_version || strcmp(req->srw_version, "2.") > 0;
765 Z_SRW_PDU *res = yaz_srw_get_pdu(o, which, req->srw_version);
766 Z_SRW_extra_arg **l = &res->extra_args, *ea;
767 l = append_extra_arg(o, l, "version", req->srw_version);
770 {
771 if (req->u.request->queryType &&
772 strcmp(req->u.request->queryType, "cql"))
773 l = append_extra_arg(o, l, "queryType", req->u.request->queryType);
774 l = append_extra_arg(o, l, "query", req->u.request->query);
775 l = append_extra_arg_int(o, l, "startRecord",
776 req->u.request->startRecord);
777 l = append_extra_arg_int(o, l, "maximumRecords",
778 req->u.request->maximumRecords);
779 if (version2)
780 {
781 l = append_extra_arg(o, l, "recordXMLEscaping",
782 req->u.request->recordPacking);
783 l = append_extra_arg(o, l, "recordPacking",
784 req->u.request->packing);
785 }
786 else
787 l = append_extra_arg(o, l, "recordPacking",
788 req->u.request->recordPacking);
789 l = append_extra_arg(o, l, "recordSchema",
790 req->u.request->recordSchema);
792 l = append_extra_arg(o, l, "sortKeys",
793 req->u.request->sort.sortKeys);
794 l = append_extra_arg(o, l, "stylesheet", req->u.request->stylesheet);
795 }
796 if (req->which == Z_SRW_explain_request &&
797 which == Z_SRW_explain_response)
798 {
799 if (version2)
800 {
801 l = append_extra_arg(o, l, "recordXMLEscaping",
803 l = append_extra_arg(o, l, "recordPacking",
805 }
806 else
807 l = append_extra_arg(o, l, "recordPacking",
809 l = append_extra_arg(o, l, "stylesheet",
811 }
812 for (ea = req->extra_args; ea; ea = ea->next)
813 l = append_extra_arg(o, l, ea->name, ea->value);
814 return res;
815}
816
817Z_SRW_PDU *yaz_srw_get_pdu(ODR o, int which, const char *version)
818{
819 Z_SRW_PDU *sr = yaz_srw_get_core_ver(o, version);
820
821 sr->which = which;
822 switch (which)
823 {
826 odr_malloc(o, sizeof(*sr->u.request));
827 sr->u.request->queryType = "cql";
828 sr->u.request->query = 0;
830 sr->u.request->sort.none = 0;
831 sr->u.request->startRecord = 0;
832 sr->u.request->maximumRecords = 0;
833 sr->u.request->recordSchema = 0;
834 sr->u.request->recordPacking = 0;
835 sr->u.request->packing = 0;
836 sr->u.request->recordXPath = 0;
837 sr->u.request->database = 0;
838 sr->u.request->resultSetTTL = 0;
839 sr->u.request->stylesheet = 0;
840 sr->u.request->facetList = 0;
841 break;
844 odr_malloc(o, sizeof(*sr->u.response));
845 sr->u.response->numberOfRecords = 0;
847 sr->u.response->resultSetId = 0;
849 sr->u.response->records = 0;
850 sr->u.response->num_records = 0;
851 sr->u.response->diagnostics = 0;
852 sr->u.response->num_diagnostics = 0;
854 sr->u.response->extra_records = 0;
855 sr->u.response->facetList = 0;
856 sr->u.response->suggestions = 0;
857 break;
860 odr_malloc(o, sizeof(*sr->u.explain_request));
862 sr->u.explain_request->packing = 0;
863 sr->u.explain_request->database = 0;
865 break;
868 odr_malloc(o, sizeof(*sr->u.explain_response));
878 break;
881 odr_malloc(o, sizeof(*sr->u.scan_request));
882 sr->u.scan_request->database = 0;
883 sr->u.scan_request->stylesheet = 0;
884 sr->u.scan_request->maximumTerms = 0;
886 sr->u.scan_request->queryType = "cql";
887 sr->u.scan_request->scanClause = 0;
888 break;
891 odr_malloc(o, sizeof(*sr->u.scan_response));
892 sr->u.scan_response->terms = 0;
893 sr->u.scan_response->num_terms = 0;
894 sr->u.scan_response->diagnostics = 0;
896 break;
899 odr_malloc(o, sizeof(*sr->u.update_request));
900 sr->u.update_request->database = 0;
901 sr->u.update_request->stylesheet = 0;
902 sr->u.update_request->record = 0;
903 sr->u.update_request->recordId = 0;
909 sr->u.request->database = 0;
910 break;
913 odr_malloc(o, sizeof(*sr->u.update_response));
915 sr->u.update_response->recordId = 0;
918 sr->u.update_response->record = 0;
924 }
925 return sr;
926}
927
928void yaz_add_name_value_int(ODR o, char **name, char **value, int *i,
929 char *a_name, Odr_int *val)
930{
931 if (val)
932 {
933 name[*i] = a_name;
934 value[*i] = nmem_printf(odr_getmem(o), ODR_INT_PRINTF, *val);
935 (*i)++;
936 }
937}
938
939void yaz_add_name_value_str(ODR o, char **name, char **value, int *i,
940 char *a_name, char *val)
941{
942 if (val)
943 {
944 name[*i] = a_name;
945 value[*i] = val;
946 (*i)++;
947 }
948}
949
950static int yaz_get_sru_parms(const Z_SRW_PDU *srw_pdu, ODR encode,
951 char **name, char **value, int max_names)
952{
953 int version2 = strcmp(srw_pdu->srw_version, "2.") > 0;
954 int i = 0;
955 char *queryType;
956 yaz_add_name_value_str(encode, name, value, &i, "version",
957 srw_pdu->srw_version);
958 name[i] = "operation";
959 switch (srw_pdu->which)
960 {
962 value[i++] = "searchRetrieve";
963 queryType = srw_pdu->u.request->queryType;
964 if (version2)
965 {
966 if (queryType && strcmp(queryType, "cql"))
967 yaz_add_name_value_str(encode, name, value, &i, "queryType",
968 queryType);
969 yaz_add_name_value_str(encode, name, value, &i, "query",
970 srw_pdu->u.request->query);
971 }
972 else
973 {
974 if (!strcmp(queryType, "cql"))
975 {
976 yaz_add_name_value_str(encode, name, value, &i, "query",
977 srw_pdu->u.request->query);
978 }
979 else if (!strcmp(queryType, "pqf"))
980 {
981 yaz_add_name_value_str(encode, name, value, &i, "x-pquery",
982 srw_pdu->u.request->query);
983 }
984 else if (!strcmp(queryType, "xcql"))
985 {
986 yaz_add_name_value_str(encode, name, value, &i, "x-cql",
987 srw_pdu->u.request->query);
988 }
989 }
990 switch (srw_pdu->u.request->sort_type)
991 {
993 break;
995 yaz_add_name_value_str(encode, name, value, &i, "sortKeys",
996 srw_pdu->u.request->sort.sortKeys);
997 break;
998 }
999 yaz_add_name_value_int(encode, name, value, &i, "startRecord",
1000 srw_pdu->u.request->startRecord);
1001 yaz_add_name_value_int(encode, name, value, &i, "maximumRecords",
1002 srw_pdu->u.request->maximumRecords);
1003 yaz_add_name_value_str(encode, name, value, &i, "recordSchema",
1004 srw_pdu->u.request->recordSchema);
1005 if (version2)
1006 {
1007 yaz_add_name_value_str(encode, name, value, &i, "recordXMLEscaping",
1008 srw_pdu->u.request->recordPacking);
1009 yaz_add_name_value_str(encode, name, value, &i, "recordPacking",
1010 srw_pdu->u.request->packing);
1011 }
1012 else
1013 yaz_add_name_value_str(encode, name, value, &i, "recordPacking",
1014 srw_pdu->u.request->recordPacking);
1015 yaz_add_name_value_str(encode, name, value, &i, "recordXPath",
1016 srw_pdu->u.request->recordXPath);
1017 yaz_add_name_value_str(encode, name, value, &i, "stylesheet",
1018 srw_pdu->u.request->stylesheet);
1019 yaz_add_name_value_int(encode, name, value, &i, "resultSetTTL",
1020 srw_pdu->u.request->resultSetTTL);
1021 {
1022 const char *facetLimit = 0;
1023 const char *facetStart = 0;
1024 const char *facetSort = 0;
1025 yaz_sru_facet_request(encode, &srw_pdu->u.request->facetList,
1026 &facetLimit, &facetStart, &facetSort);
1027 yaz_add_name_value_str(encode, name, value, &i, "facetLimit",
1028 (char *) facetLimit);
1029 yaz_add_name_value_str(encode, name, value, &i, "facetStart",
1030 (char *) facetStart);
1031 yaz_add_name_value_str(encode, name, value, &i, "facetSort",
1032 (char *) facetSort);
1033 }
1034 break;
1036 value[i++] = "explain";
1037
1038 if (version2)
1039 {
1040 yaz_add_name_value_str(encode, name, value, &i, "recordXMLEscaping",
1041 srw_pdu->u.explain_request->recordPacking);
1042 yaz_add_name_value_str(encode, name, value, &i, "recordPacking",
1043 srw_pdu->u.explain_request->packing);
1044 }
1045 else
1046 yaz_add_name_value_str(encode, name, value, &i, "recordPacking",
1047 srw_pdu->u.explain_request->recordPacking);
1048 yaz_add_name_value_str(encode, name, value, &i, "stylesheet",
1049 srw_pdu->u.explain_request->stylesheet);
1050 break;
1051 case Z_SRW_scan_request:
1052 value[i++] = "scan";
1053 queryType = srw_pdu->u.scan_request->queryType;
1054 if (version2)
1055 {
1056 if (queryType && strcmp(queryType, "cql"))
1057 yaz_add_name_value_str(encode, name, value, &i, "queryType",
1058 queryType);
1059 yaz_add_name_value_str(encode, name, value, &i, "scanClause",
1060 srw_pdu->u.scan_request->scanClause);
1061 }
1062 else
1063 {
1064 if (!queryType || !strcmp(queryType, "cql"))
1065 yaz_add_name_value_str(encode, name, value, &i, "scanClause",
1066 srw_pdu->u.scan_request->scanClause);
1067 else if (!strcmp(queryType, "pqf"))
1068 yaz_add_name_value_str(encode, name, value, &i, "x-pScanClause",
1069 srw_pdu->u.scan_request->scanClause);
1070 else if (!strcmp(queryType, "xcql"))
1071 yaz_add_name_value_str(encode, name, value, &i,
1072 "x-cqlScanClause",
1073 srw_pdu->u.scan_request->scanClause);
1074 }
1075 yaz_add_name_value_int(encode, name, value, &i, "responsePosition",
1076 srw_pdu->u.scan_request->responsePosition);
1077 yaz_add_name_value_int(encode, name, value, &i, "maximumTerms",
1078 srw_pdu->u.scan_request->maximumTerms);
1079 yaz_add_name_value_str(encode, name, value, &i, "stylesheet",
1080 srw_pdu->u.scan_request->stylesheet);
1081 break;
1083 value[i++] = "update";
1084 break;
1085 default:
1086 return -1;
1087 }
1088 if (srw_pdu->extra_args)
1089 {
1090 Z_SRW_extra_arg *ea = srw_pdu->extra_args;
1091 for (; ea && i < max_names-1; ea = ea->next)
1092 {
1093 name[i] = ea->name;
1094 value[i] = ea->value;
1095 i++;
1096 }
1097 }
1098 name[i++] = 0;
1099
1100 return 0;
1101}
1102
1104 ODR encode, const char *charset)
1105{
1106 char *name[MAX_SRU_PARAMETERS], *value[MAX_SRU_PARAMETERS]; /* definite upper limit for SRU params */
1107 char *uri_args;
1108 char *path;
1109 char *cp;
1110
1112 srw_pdu->username, srw_pdu->password);
1113 if (yaz_get_sru_parms(srw_pdu, encode, name, value, MAX_SRU_PARAMETERS))
1114 return -1;
1115 yaz_array_to_uri(&uri_args, encode, name, value);
1116
1117 hreq->method = "GET";
1118
1119 cp = strchr(hreq->path, '#');
1120 if (cp)
1121 *cp = '\0';
1122
1123 path = nmem_printf(odr_getmem(encode), "%s%c%s",
1124 hreq->path, strchr(hreq->path, '?') ? '&' : '?', uri_args);
1125
1126 hreq->path = path;
1127
1129 "text/xml", charset);
1130 return 0;
1131}
1132
1134 ODR encode, const char *charset)
1135{
1136 char *name[MAX_SRU_PARAMETERS], *value[MAX_SRU_PARAMETERS]; /* definite upper limit for SRU params */
1137 char *uri_args;
1138
1140 srw_pdu->username, srw_pdu->password);
1141 if (yaz_get_sru_parms(srw_pdu, encode, name, value, MAX_SRU_PARAMETERS))
1142 return -1;
1143
1144 yaz_array_to_uri(&uri_args, encode, name, value);
1145
1146 hreq->method = "POST";
1147
1148 hreq->content_buf = uri_args;
1149 hreq->content_len = strlen(uri_args);
1150
1152 "application/x-www-form-urlencoded",
1153 charset);
1154 return 0;
1155}
1156
1158 ODR odr, const char *charset)
1159{
1160 Z_SOAP_Handler handlers[3] = {
1161#if YAZ_HAVE_XML2
1164#endif
1165 {0, 0, 0}
1166 };
1167 Z_SOAP *p = (Z_SOAP*) odr_malloc(odr, sizeof(*p));
1168
1170 srw_pdu->username, srw_pdu->password);
1172 &hreq->headers,
1173 "text/xml", 0 /* no charset in MIME */);
1174
1176 "SOAPAction", "\"\"");
1177 p->which = Z_SOAP_generic;
1178 p->u.generic = (Z_SOAP_Generic *) odr_malloc(odr, sizeof(*p->u.generic));
1179 p->u.generic->no = 0;
1180 p->u.generic->ns = 0;
1181 p->u.generic->p = srw_pdu;
1182 p->ns = "http://schemas.xmlsoap.org/soap/envelope/";
1183
1184#if YAZ_HAVE_XML2
1185 if (srw_pdu->which == Z_SRW_update_request ||
1186 srw_pdu->which == Z_SRW_update_response)
1187 p->u.generic->no = 1; /* second handler */
1188#endif
1189 return z_soap_codec_enc(odr, &p,
1190 &hreq->content_buf,
1191 &hreq->content_len, handlers,
1192 charset);
1193}
1194
1196{
1198 = (Z_SRW_recordVersion *) odr_malloc(odr,num * sizeof(*ver));
1199 int i;
1200 for (i = 0; i < num; ++i)
1201 {
1202 ver[i].versionType = 0;
1203 ver[i].versionValue = 0;
1204 }
1205 return ver;
1206}
1207
1208const char *yaz_srw_pack_to_str(int pack)
1209{
1210 switch(pack)
1211 {
1213 return "string";
1215 return "xml";
1217 return "url";
1218 }
1219 return 0;
1220}
1221
1222int yaz_srw_str_to_pack(const char *str)
1223{
1224 if (!yaz_matchstr(str, "string"))
1226 if (!yaz_matchstr(str, "xml"))
1228 if (!yaz_matchstr(str, "url"))
1230 return -1;
1231}
1232
1233void yaz_encode_sru_extra(Z_SRW_PDU *sr, ODR odr, const char *extra_args)
1234{
1235 if (extra_args)
1236 {
1237 char **name;
1238 char **val;
1239 Z_SRW_extra_arg **ea = &sr->extra_args;
1240 yaz_uri_to_array(extra_args, odr, &name, &val);
1241
1242 while (*name)
1243 {
1244 ea = append_extra_arg(odr, ea, *name, *val);
1245 val++;
1246 name++;
1247 }
1248 }
1249}
1250
1251
1252/*
1253 * Local variables:
1254 * c-basic-offset: 4
1255 * c-file-style: "Stroustrup"
1256 * indent-tabs-mode: nil
1257 * End:
1258 * vim: shiftwidth=4 tabstop=8 expandtab
1259 */
1260
int yaz_base64decode(const char *in, char *out)
decodes Base64 string
Definition base64.c:82
Header for Base64 utilities.
const char * yaz_diag_srw_str(int code)
Definition diagsrw.c:110
#define YAZ_SRW_UNSUPP_VERSION
Definition diagsrw.h:14
#define YAZ_SRW_UNSUPP_PARAMETER_VALUE
Definition diagsrw.h:15
#define YAZ_SRW_UNSUPP_OPERATION
Definition diagsrw.h:13
#define YAZ_SRW_UNSUPP_PARAMETER
Definition diagsrw.h:17
#define YAZ_SRW_MANDATORY_PARAMETER_NOT_SUPPLIED
Definition diagsrw.h:16
void z_HTTP_header_add_basic_auth(ODR o, Z_HTTP_Header **hp, const char *username, const char *password)
Definition http.c:168
const char * z_HTTP_header_lookup(const Z_HTTP_Header *hp, const char *n)
Definition http.c:229
void z_HTTP_header_add(ODR o, Z_HTTP_Header **hp, const char *n, const char *v)
Definition http.c:185
void z_HTTP_header_add_content_type(ODR o, Z_HTTP_Header **hp, const char *content_type, const char *charset)
Definition http.c:148
char * name
Definition initopt.c:18
int yaz_strcmp_del(const char *a, const char *b, const char *b_del)
match a and b with some delimitor for b
Definition matchstr.c:72
int yaz_matchstr(const char *s1, const char *s2)
match strings - independent of case and '-'
Definition matchstr.c:42
Header for YAZ iconv interface.
char * nmem_printf(NMEM nmem, const char *fmt,...)
formats and prints a string into NMEM allocated memory
Definition nmemsdup.c:145
#define odr_getmem(o)
Definition odr.h:216
#define ODR_INT_PRINTF
Definition odr.h:49
struct odr * ODR
Definition odr.h:121
nmem_int_t Odr_int
Definition odr.h:47
Odr_int * odr_intdup(ODR o, Odr_int v)
Definition odr_mem.c:51
void * odr_malloc(ODR o, size_t size)
Definition odr_mem.c:31
char * odr_strdupn(ODR o, const char *str, size_t n)
Definition odr_mem.c:46
char * odr_strdup(ODR o, const char *str)
Definition odr_mem.c:36
void yaz_snprintf(char *buf, size_t size, const char *fmt,...)
Definition snprintf.c:31
Header for config file reading utilities.
int z_soap_codec(ODR o, Z_SOAP **pp, char **content_buf, int *content_len, Z_SOAP_Handler *handlers)
Definition soap.c:341
int z_soap_codec_enc(ODR o, Z_SOAP **pp, char **content_buf, int *content_len, Z_SOAP_Handler *handlers, const char *encoding)
Definition soap.c:332
int(* Z_SOAP_fun)(ODR o, void *ptr, void **handler_data, void *client_data, const char *ns)
Definition soap.h:65
#define Z_SOAP_generic
Definition soap.h:53
SRU private header.
char * yaz_negotiate_sru_version(char *input_ver)
Definition srw.c:26
void yaz_sru_facet_request(ODR, Z_FacetList **facetList, const char **limit, const char **start, const char **sort)
Definition sru_facet.c:61
int yaz_ucp_codec(ODR o, void *vptr, Z_SRW_PDU **handler_data, void *client_data, const char *ns_ucp_str)
Definition srw.c:1144
int yaz_srw_codec(ODR o, void *vptr, Z_SRW_PDU **handler_data, void *client_data, const char *ns)
Definition srw.c:575
Header for SRW/SRU.
#define YAZ_XMLNS_SRU_v2_mask
Definition srw.h:332
#define Z_SRW_recordPacking_XML
Definition srw.h:55
#define Z_SRW_searchRetrieve_response
Definition srw.h:192
#define Z_SRW_explain_request
Definition srw.h:193
#define Z_SRW_update_request
Definition srw.h:197
#define Z_SRW_scan_request
Definition srw.h:195
#define YAZ_XMLNS_SRU_v1_1
Definition srw.h:328
#define Z_SRW_sort_type_none
Definition srw.h:74
#define Z_SRW_recordPacking_string
Definition srw.h:54
#define Z_SRW_recordPacking_URL
Definition srw.h:56
#define Z_SRW_update_response
Definition srw.h:198
#define Z_SRW_sort_type_sort
Definition srw.h:75
#define Z_SRW_explain_response
Definition srw.h:194
#define YAZ_XMLNS_SRU_v1_0
Definition srw.h:327
#define Z_SRW_scan_response
Definition srw.h:196
#define Z_SRW_searchRetrieve_request
Definition srw.h:191
#define YAZ_XMLNS_UPDATE_v0_9
Definition srw.h:331
int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, Z_SOAP **soap_package, ODR decode, char **charset, Z_SRW_diagnostic **diag, int *num_diag)
Definition srwutil.c:357
Z_SRW_PDU * yaz_srw_get_pdu_e(ODR o, int which, Z_SRW_PDU *req)
Definition srwutil.c:762
static Z_SRW_PDU * yaz_srw_get_core_ver(ODR o, const char *version)
Definition srwutil.c:739
void yaz_encode_sru_extra(Z_SRW_PDU *sr, ODR odr, const char *extra_args)
Definition srwutil.c:1233
Z_SRW_PDU * yaz_srw_get_pdu(ODR o, int which, const char *version)
Definition srwutil.c:817
static Z_SRW_extra_arg ** append_extra_arg_int(ODR odr, Z_SRW_extra_arg **l, const char *n, Odr_int *v)
Definition srwutil.c:40
static Z_SRW_extra_arg ** append_extra_arg(ODR odr, Z_SRW_extra_arg **l, const char *n, const char *v)
Definition srwutil.c:24
static int yaz_get_sru_parms(const Z_SRW_PDU *srw_pdu, ODR encode, char **name, char **value, int max_names)
Definition srwutil.c:950
static int yaz_sru_decode_integer(ODR odr, const char *pname, const char *valstr, Odr_int **valp, Z_SRW_diagnostic **diag, int *num_diag, int min_value)
Definition srwutil.c:329
int yaz_srw_check_content_type(Z_HTTP_Response *hres)
Definition srwutil.c:89
void yaz_encode_sru_dbpath_buf(char *dst, const char *db)
encode SRU database for HTTP path
Definition srwutil.c:57
void yaz_add_sru_update_diagnostic(ODR o, Z_SRW_diagnostic **d, int *num, int code, const char *addinfo)
Definition srwutil.c:194
int yaz_srw_str_to_pack(const char *str)
Definition srwutil.c:1222
void yaz_add_srw_diagnostic_uri(ODR o, Z_SRW_diagnostic **d, int *num, const char *uri, const char *message, const char *details)
Definition srwutil.c:170
void yaz_add_name_value_int(ODR o, char **name, char **value, int *i, char *a_name, Odr_int *val)
Definition srwutil.c:928
int yaz_sru_get_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, ODR encode, const char *charset)
Definition srwutil.c:1103
char * yaz_encode_sru_dbpath_odr(ODR out, const char *db)
encode SRU database for HTTP path
Definition srwutil.c:64
void yaz_mk_sru_surrogate(ODR o, Z_SRW_record *record, int pos, int code, const char *details)
Definition srwutil.c:204
static char * yaz_decode_sru_dbpath_odr(ODR n, const char *uri, size_t len)
Definition srwutil.c:52
const char * yaz_element_attribute_value_get(xmlNodePtr ptr, const char *node_name, const char *attribute_name)
Definition srwutil.c:72
#define MAX_SRU_PARAMETERS
Definition srwutil.c:22
int yaz_srw_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, Z_SOAP **soap_package, ODR decode, char **charset)
Definition srwutil.c:258
Z_SRW_recordVersion * yaz_srw_get_record_versions(ODR odr, int num)
Definition srwutil.c:1195
int yaz_sru_post_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, ODR encode, const char *charset)
Definition srwutil.c:1133
static void grab_charset(ODR o, const char *content_type, char **charset)
Definition srwutil.c:232
void yaz_add_name_value_str(ODR o, char **name, char **value, int *i, char *a_name, char *val)
Definition srwutil.c:939
Z_SRW_record * yaz_srw_get_record(ODR o)
Definition srwutil.c:734
void yaz_mk_srw_diagnostic(ODR o, Z_SRW_diagnostic *d, const char *uri, const char *message, const char *details)
Definition srwutil.c:146
static void yaz_srw_decodeauth(Z_SRW_PDU *sr, Z_HTTP_Request *hreq, char *username, char *password, ODR decode)
Definition srwutil.c:109
int yaz_sru_soap_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, ODR odr, const char *charset)
Definition srwutil.c:1157
void yaz_mk_std_diagnostic(ODR o, Z_SRW_diagnostic *d, int code, const char *details)
Definition srwutil.c:161
const char * yaz_srw_pack_to_str(int pack)
Definition srwutil.c:1208
void yaz_add_srw_diagnostic(ODR o, Z_SRW_diagnostic **d, int *num, int code, const char *addinfo)
Definition srwutil.c:184
Z_SRW_PDU * yaz_srw_get_core_v_2_0(ODR o)
Definition srwutil.c:751
Z_SRW_extra_record * yaz_srw_get_extra_record(ODR o)
Definition srwutil.c:706
Z_SRW_record * yaz_srw_get_records(ODR o, int n)
Definition srwutil.c:718
Z_SRW_PDU * yaz_srw_get(ODR o, int which)
Definition srwutil.c:756
Z_HTTP_Header * headers
Definition zgdu.h:52
char * content_buf
Definition zgdu.h:53
char * path
Definition zgdu.h:51
char * method
Definition zgdu.h:49
int content_len
Definition zgdu.h:54
Z_HTTP_Header * headers
Definition zgdu.h:60
void * p
Definition soap.h:49
char * ns
Definition soap.h:48
char * ns
Definition soap.h:68
Definition soap.h:55
union Z_SOAP::@376262347373245141365154145051227323112037301017 u
int which
Definition soap.h:56
const char * ns
Definition soap.h:62
Z_SOAP_Generic * generic
Definition soap.h:59
Z_SRW_explainRequest * explain_request
Definition srw.h:205
union Z_SRW_PDU::@153265143164032275136020372035363167301151223027 u
Z_SRW_updateRequest * update_request
Definition srw.h:209
Z_SRW_updateResponse * update_response
Definition srw.h:210
char * srw_version
Definition srw.h:212
Z_SRW_scanRequest * scan_request
Definition srw.h:207
Z_SRW_searchRetrieveResponse * response
Definition srw.h:204
Z_SRW_extra_arg * extra_args
Definition srw.h:219
Z_SRW_scanResponse * scan_response
Definition srw.h:208
Z_SRW_explainResponse * explain_response
Definition srw.h:206
Z_SRW_searchRetrieveRequest * request
Definition srw.h:203
char * password
Definition srw.h:214
int which
Definition srw.h:201
char * extraResponseData_buf
Definition srw.h:221
int extraResponseData_len
Definition srw.h:222
char * username
Definition srw.h:213
char * message
Definition srw.h:66
char * details
Definition srw.h:65
char * uri
Definition srw.h:64
char * database
Definition srw.h:118
char * stylesheet
Definition srw.h:119
char * recordPacking
Definition srw.h:116
Z_SRW_diagnostic * diagnostics
Definition srw.h:124
Z_SRW_record record
Definition srw.h:123
Z_SRW_extra_record * extra_record
Definition srw.h:126
char * value
Definition srw.h:174
Z_SRW_extra_arg * next
Definition srw.h:175
char * name
Definition srw.h:173
int extraRecordData_len
Definition srw.h:46
char * extraRecordData_buf
Definition srw.h:45
char * recordIdentifier
Definition srw.h:47
char * versionValue
Definition srw.h:155
char * versionType
Definition srw.h:154
char * recordData_buf
Definition srw.h:58
int recordPacking
Definition srw.h:53
char * recordSchema
Definition srw.h:51
int recordData_len
Definition srw.h:59
Odr_int * recordPosition
Definition srw.h:60
Odr_int * responsePosition
Definition srw.h:132
Odr_int * maximumTerms
Definition srw.h:133
char * queryType
Definition srw.h:130
char * scanClause
Definition srw.h:131
char * stylesheet
Definition srw.h:134
char * database
Definition srw.h:135
Z_SRW_diagnostic * diagnostics
Definition srw.h:148
Z_SRW_scanTerm * terms
Definition srw.h:146
int num_diagnostics
Definition srw.h:149
Odr_int * resultSetTTL
Definition srw.h:93
Z_FacetList * facetList
Definition srw.h:94
union Z_SRW_searchRetrieveRequest::@240121103265220276224106134266143351075177324020 sort
Odr_int * maximumRecords
Definition srw.h:84
Odr_int * startRecord
Definition srw.h:83
Z_SRW_record * records
Definition srw.h:103
Odr_int * numberOfRecords
Definition srw.h:98
Z_SRW_diagnostic * diagnostics
Definition srw.h:106
Odr_int * nextRecordPosition
Definition srw.h:108
Odr_int * resultSetIdleTime
Definition srw.h:101
Z_SRW_extra_record ** extra_records
Definition srw.h:110
Z_FacetList * facetList
Definition srw.h:111
char * database
Definition srw.h:159
int extraRequestData_len
Definition srw.h:167
char * stylesheet
Definition srw.h:168
char * recordId
Definition srw.h:161
Z_SRW_extra_record * extra_record
Definition srw.h:165
Z_SRW_recordVersion * recordVersions
Definition srw.h:162
int num_recordVersions
Definition srw.h:163
Z_SRW_record * record
Definition srw.h:164
char * extraRequestData_buf
Definition srw.h:166
char * operationStatus
Definition srw.h:179
char * recordId
Definition srw.h:180
Z_SRW_diagnostic * diagnostics
Definition srw.h:187
Z_SRW_record * record
Definition srw.h:183
int extraResponseData_len
Definition srw.h:186
int num_recordVersions
Definition srw.h:182
Z_SRW_recordVersion * recordVersions
Definition srw.h:181
char * extraResponseData_buf
Definition srw.h:185
Z_SRW_extra_record * extra_record
Definition srw.h:184
Definition odr.h:125
int yaz_uri_to_array(const char *path, ODR o, char ***name, char ***val)
Definition uri.c:122
void yaz_array_to_uri(char **path, ODR o, char **name, char **value)
Definition uri.c:99
Header for YAZ iconv interface.