YAZ 5.38.1
zoom-c.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 <assert.h>
14#include <string.h>
15#include <errno.h>
16#include "zoom-p.h"
17
18#include <yaz/yaz-util.h>
19#include <yaz/xmalloc.h>
20#include <yaz/otherinfo.h>
21#include <yaz/log.h>
22#include <yaz/diagbib1.h>
23#include <yaz/charneg.h>
24#include <yaz/query-charset.h>
25#include <yaz/snprintf.h>
26#include <yaz/facet.h>
27
28#include <yaz/shptr.h>
29
30#if SHPTR
32#endif
33
34static int log_api0 = 0;
35static int log_details0 = 0;
36
38static zoom_ret do_write_ex(ZOOM_connection c, char *buf_out, int len_out);
39
40static void initlog(void)
41{
42 static int log_level_initialized = 0;
43
45 {
47 log_details0 = yaz_log_module_level("zoomdetails");
49 }
50}
51
52static zoom_ret send_HTTP_redirect(ZOOM_connection c, const char *uri);
53
55 const char *dset,
56 const char *addinfo, const char *addinfo2)
57{
58 char *cp;
59
60 xfree(c->addinfo);
61 c->addinfo = 0;
62 c->error = error;
63 if (!c->diagset || strcmp(dset, c->diagset))
64 {
65 xfree(c->diagset);
66 c->diagset = xstrdup(dset);
67 /* remove integer part from SRW diagset .. */
68 if ((cp = strrchr(c->diagset, '/')))
69 *cp = '\0';
70 }
71 if (addinfo && addinfo2)
72 {
73 c->addinfo = (char*) xmalloc(strlen(addinfo) + strlen(addinfo2) + 3);
74 strcpy(c->addinfo, addinfo);
75 strcat(c->addinfo, ": ");
76 strcat(c->addinfo, addinfo2);
77 }
78 else if (addinfo)
79 c->addinfo = xstrdup(addinfo);
80 if (error != ZOOM_ERROR_NONE)
81 {
82 yaz_log(c->log_api, "%p set_dset_error %s %s:%d %s %s",
83 c, c->host_port ? c->host_port : "<>", dset, error,
84 addinfo ? addinfo : "",
85 addinfo2 ? addinfo2 : "");
86 }
87}
88
89int ZOOM_uri_to_code(const char *uri)
90{
91 int code = 0;
92 const char *cp;
93 if ((cp = strrchr(uri, '/')))
94 code = atoi(cp+1);
95 return code;
96}
97
98void ZOOM_set_error(ZOOM_connection c, int error, const char *addinfo)
99{
100 ZOOM_set_dset_error(c, error, "ZOOM", addinfo, 0);
101}
102
104{
105 /*
106 * If an error is tied to an operation then it's ok to clear: for
107 * example, a diagnostic returned from a search is cleared by a
108 * subsequent search. However, problems such as Connection Lost
109 * or Init Refused are not cleared, because they are not
110 * recoverable: doing another search doesn't help.
111 */
112
114 switch (c->error)
115 {
120 case ZOOM_ERROR_INIT:
123 break;
124 default:
126 }
127}
128
130{
131 switch(task->which)
132 {
133 case ZOOM_TASK_SEARCH:
134 yaz_log(YLOG_LOG, "search p=%p", task);
135 break;
137 yaz_log(YLOG_LOG, "connect p=%p", task);
138 break;
139 case ZOOM_TASK_SCAN:
140 yaz_log(YLOG_LOG, "scan p=%p", task);
141 break;
142 }
143}
144
146{
147 ZOOM_task task;
148 yaz_log(YLOG_LOG, "connection p=%p tasks", c);
149 for (task = c->tasks; task; task = task->next)
151}
152
154{
155 ZOOM_task *taskp = &c->tasks;
156 while (*taskp)
157 taskp = &(*taskp)->next;
158 *taskp = (ZOOM_task) xmalloc(sizeof(**taskp));
159 (*taskp)->running = 0;
160 (*taskp)->which = which;
161 (*taskp)->next = 0;
162 clear_error(c);
163 return *taskp;
164}
165
167{
168 return c->tasks ? 0 : 1;
169}
170
172{
173 ZOOM_task task = (ZOOM_task) xmalloc(sizeof(*task));
174
175 task->next = c->tasks;
176 c->tasks = task;
177
178 task->running = 0;
179 task->which = which;
180 return task;
181}
182
184{
185 ZOOM_task task = c->tasks;
186
187 if (task)
188 {
189 c->tasks = task->next;
190 switch (task->which)
191 {
192 case ZOOM_TASK_SEARCH:
193 resultset_destroy(task->u.search.resultset);
194 xfree(task->u.search.syntax);
195 xfree(task->u.search.elementSetName);
196 xfree(task->u.search.schema);
197 break;
199 break;
200 case ZOOM_TASK_SCAN:
201 ZOOM_scanset_destroy(task->u.scan.scan);
202 break;
204 ZOOM_package_destroy(task->u.package);
205 break;
206 case ZOOM_TASK_SORT:
207 resultset_destroy(task->u.sort.resultset);
208 ZOOM_query_destroy(task->u.sort.q);
209 break;
210 default:
211 assert(0);
212 }
213 xfree(task);
214
215 if (!c->tasks)
216 {
219 }
220 }
221}
222
228
229static void odr_wrbuf_write(ODR o, void *handle, int type,
230 const char *buf, int len)
231{
232 WRBUF w = (WRBUF) handle;
233 wrbuf_write(w, buf, len);
234}
235
238{
239 ZOOM_connection c = (ZOOM_connection) xmalloc(sizeof(*c));
240
241 initlog();
242
243 c->log_api = log_api0;
245
246 yaz_log(c->log_api, "%p ZOOM_connection_create", c);
247
248 c->proto = PROTO_Z3950;
249 c->cs = 0;
251 c->reconnect_ok = 0;
252 c->state = STATE_IDLE;
253 c->addinfo = 0;
254 c->diagset = 0;
256 c->buf_in = 0;
257 c->len_in = 0;
258 c->buf_out = 0;
259 c->len_out = 0;
260 c->resultsets = 0;
261
263
264 c->host_port = 0;
265 c->proxy = 0;
266 c->tproxy = 0;
267 c->proxy_mode = 0;
268
269 c->charset = c->lang = 0;
270
271 c->cookie_out = 0;
272 c->cookie_in = 0;
273 c->client_IP = 0;
274 c->tasks = 0;
275
276 c->user = 0;
277 c->group = 0;
278 c->password = 0;
279 c->url_authentication = 0;
280
281 c->maximum_record_size = 0;
283
286 c->odr_print = 0;
287 c->odr_save = 0;
288
289 c->async = 0;
290 c->check_cert = 0;
293
294 c->m_queue_front = 0;
295 c->m_queue_back = 0;
296
297 c->sru_version = 0;
298 c->no_redirects = 0;
299 c->cookies = 0;
300 c->location = 0;
301 c->saveAPDU_wrbuf = 0;
302
304 return c;
305}
306
307ZOOM_API(void) ZOOM_connection_save_apdu_wrbuf(ZOOM_connection c, WRBUF w)
308{
309 if (c->odr_save)
310 {
312 c->odr_save = 0;
313 }
314 if (w)
315 {
318 }
319}
320
321/* set database names. Take local databases (if set); otherwise
322 take databases given in ZURL (if set); otherwise use Default */
324 int *num, ODR odr)
325{
326 char **databaseNames;
327 const char *cp = ZOOM_options_get(options, "databaseName");
328
329 if ((!cp || !*cp) && con->host_port)
330 cs_get_host_args(con->host_port, &cp);
331 if (!cp || !*cp)
332 cp = "Default";
333 nmem_strsplit(odr_getmem(odr), "+", cp, &databaseNames, num);
334 return databaseNames;
335}
336
338 ZOOM_connection_new(const char *host, int portnum)
339{
341
342 ZOOM_connection_connect(c, host, portnum);
343 return c;
344}
345
347{
348 if (!s || !*s)
349 return zoom_sru_soap;
350 if (!yaz_matchstr(s, "soap"))
351 return zoom_sru_soap;
352 else if (!yaz_matchstr(s, "get"))
353 return zoom_sru_get;
354 else if (!yaz_matchstr(s, "post"))
355 return zoom_sru_post;
356 else if (!yaz_matchstr(s, "solr"))
357 return zoom_sru_solr;
358 return zoom_sru_error;
359}
360
361ZOOM_API(void)
363 const char *host, int portnum)
364{
365 const char *val;
366
367 initlog();
368
369 yaz_log(c->log_api, "%p ZOOM_connection_connect host=%s portnum=%d",
370 c, host ? host : "null", portnum);
371
374
375 if (c->cs)
376 {
377 yaz_log(c->log_details, "%p ZOOM_connection_connect reconnect ok", c);
378 c->reconnect_ok = 1;
379 return;
380 }
381 yaz_log(c->log_details, "%p ZOOM_connection_connect connect", c);
382 xfree(c->proxy);
383 c->proxy = 0;
384 val = ZOOM_options_get(c->options, "proxy");
385 if (val && *val)
386 {
387 yaz_log(c->log_details, "%p ZOOM_connection_connect proxy=%s", c, val);
388 c->proxy = xstrdup(val);
389 }
390
391 xfree(c->tproxy);
392 c->tproxy = 0;
393 val = ZOOM_options_get(c->options, "tproxy");
394 if (val && *val)
395 {
396 yaz_log(c->log_details, "%p ZOOM_connection_connect tproxy=%s", c, val);
397 c->tproxy = xstrdup(val);
398 }
399
400 xfree(c->charset);
401 c->charset = 0;
402 val = ZOOM_options_get(c->options, "charset");
403 if (val && *val)
404 {
405 yaz_log(c->log_details, "%p ZOOM_connection_connect charset=%s", c, val);
406 c->charset = xstrdup(val);
407 }
408
409 xfree(c->lang);
410 val = ZOOM_options_get(c->options, "lang");
411 if (val && *val)
412 {
413 yaz_log(c->log_details, "%p ZOOM_connection_connect lang=%s", c, val);
414 c->lang = xstrdup(val);
415 }
416 else
417 c->lang = 0;
418
419 if (host)
420 {
421 char hostn[128];
422 const char *http_lead;
423
424 val = ZOOM_options_get(c->options, "sru");
425 if (val && *val && !strstr(host, "://"))
426 http_lead = "http://";
427 else
428 http_lead = "";
429 c->sru_mode = get_sru_mode_from_string(val);
430
431 xfree(c->host_port);
432 if (portnum)
433 {
434 yaz_snprintf(hostn, sizeof(hostn), "%s:%d", host, portnum);
435 host = hostn;
436 }
437 c->host_port = xmalloc(strlen(host) + strlen(http_lead) + 1);
438 strcpy(c->host_port, http_lead);
439 strcat(c->host_port, host);
440 }
441
442 {
443 /*
444 * If the "<scheme>:" part of the host string is preceded by one
445 * or more comma-separated <name>=<value> pairs, these are taken
446 * to be options to be set on the connection object. Among other
447 * applications, this facility can be used to embed authentication
448 * in a host string:
449 * user=admin,password=secret,tcp:localhost:9999
450 */
451 char *remainder = c->host_port;
452 char *pcolon = strchr(remainder, ':');
453 char *pcomma;
454 char *pequals;
455 while ((pcomma = strchr(remainder, ',')) != 0 &&
456 (pcolon == 0 || pcomma < pcolon))
457 {
458 *pcomma = '\0';
459 if ((pequals = strchr(remainder, '=')) != 0)
460 {
461 *pequals = '\0';
462 ZOOM_connection_option_set(c, remainder, pequals+1);
463 }
464 remainder = pcomma+1;
465 }
466
467 if (remainder != c->host_port)
468 {
469 remainder = xstrdup(remainder);
470 xfree(c->host_port);
471 c->host_port = remainder;
472 }
473 }
474
475 xfree(c->sru_version);
476 val = ZOOM_options_get(c->options, "sru_version");
477 c->sru_version = xstrdup(val ? val : "1.2");
478
479 ZOOM_options_set(c->options, "host", c->host_port);
480
481 xfree(c->cookie_out);
482 c->cookie_out = 0;
483 val = ZOOM_options_get(c->options, "cookie");
484 if (val && *val)
485 {
486 yaz_log(c->log_details, "%p ZOOM_connection_connect cookie=%s", c, val);
487 c->cookie_out = xstrdup(val);
488 }
489
490 xfree(c->client_IP);
491 c->client_IP = 0;
492 val = ZOOM_options_get(c->options, "clientIP");
493 if (val && *val)
494 {
495 yaz_log(c->log_details, "%p ZOOM_connection_connect clientIP=%s",
496 c, val);
497 c->client_IP = xstrdup(val);
498 }
499
500 xfree(c->group);
501 c->group = 0;
502 val = ZOOM_options_get(c->options, "group");
503 if (val && *val)
504 c->group = xstrdup(val);
505
506 xfree(c->user);
507 c->user = 0;
508 val = ZOOM_options_get(c->options, "user");
509 if (val && *val)
510 c->user = xstrdup(val);
511
512 xfree(c->password);
513 c->password = 0;
514 val = ZOOM_options_get(c->options, "password");
515 if (!val)
516 val = ZOOM_options_get(c->options, "pass");
517 if (val && *val)
518 c->password = xstrdup(val);
519
520 val = ZOOM_options_get(c->options, "authenticationMode");
521 if (val && !strcmp(val, "url"))
522 c->url_authentication = 1;
523 else
524 c->url_authentication = 0;
525
526 c->maximum_record_size =
527 ZOOM_options_get_int(c->options, "maximumRecordSize", 64*1024*1024);
528 c->preferred_message_size =
529 ZOOM_options_get_int(c->options, "preferredMessageSize", 64*1024*1024);
530
531 c->async = ZOOM_options_get_bool(c->options, "async", 0);
532 c->check_cert = ZOOM_options_get_bool(c->options, "check_cert", 0);
533
534 yaz_cookies_destroy(c->cookies);
535 c->cookies = yaz_cookies_create();
536
538 {
540 return;
541 }
542 if (c->sru_mode == zoom_sru_error)
543 {
546 return;
547 }
548
549 if (c->odr_print)
550 odr_destroy(c->odr_print);
551 c->odr_print = 0;
552 val = ZOOM_options_get(c->options, "apdufile");
553 if (val)
554 {
555 c->odr_print = odr_createmem(ODR_PRINT);
556 if (strcmp(val, "-"))
557 {
558 FILE *f = fopen(val, "a");
559 if (!f)
560 {
561 WRBUF w = wrbuf_alloc();
562 wrbuf_printf(w, "fopen: %s", val);
564 wrbuf_destroy(w);
565 return;
566 }
567 odr_setprint(c->odr_print, f);
568 }
569 }
570 else if (ZOOM_options_get_bool(c->options, "apdulog", 0))
571 {
572 c->odr_print = odr_createmem(ODR_PRINT);
573 odr_setprint_noclose(c->odr_print, yaz_log_file());
574 }
575
576 yaz_log(c->log_details, "%p ZOOM_connection_connect async=%d", c, c->async);
578
579 if (!c->async)
580 {
581 while (ZOOM_event(1, &c))
582 ;
583 }
584}
585
587{
588 if (r->connection)
589 {
590 /* remove ourselves from the resultsets in connection */
592 while (1)
593 {
594 assert(*rp); /* we must be in this list!! */
595 if (*rp == r)
596 { /* OK, we're here - take us out of it */
597 *rp = (*rp)->next;
598 break;
599 }
600 rp = &(*rp)->next;
601 }
602 r->connection = 0;
603 }
604}
605
606ZOOM_API(void)
608{
610 if (!c)
611 return;
612 yaz_log(c->log_api, "%p ZOOM_connection_destroy", c);
613
615 if (c->cs)
616 cs_close(c->cs);
617
618 for (r = c->resultsets; r; r = r->next)
619 r->connection = 0;
620
621 xfree(c->buf_in);
622 xfree(c->addinfo);
623 xfree(c->diagset);
624 odr_destroy(c->odr_in);
625 odr_destroy(c->odr_out);
626 if (c->odr_save)
627 odr_destroy(c->odr_save);
628 if (c->odr_print)
629 odr_destroy(c->odr_print);
630 ZOOM_options_destroy(c->options);
633 xfree(c->host_port);
634 xfree(c->proxy);
635 xfree(c->tproxy);
636 xfree(c->charset);
637 xfree(c->lang);
638 xfree(c->cookie_out);
639 xfree(c->cookie_in);
640 xfree(c->client_IP);
641 xfree(c->user);
642 xfree(c->group);
643 xfree(c->password);
644 xfree(c->sru_version);
645 xfree(c->location);
646 yaz_cookies_destroy(c->cookies);
647 wrbuf_destroy(c->saveAPDU_wrbuf);
648 xfree(c);
649}
650
652{
653 if (r)
654 {
656 (r->refcount)++;
657 yaz_log(log_details0, "%p ZOOM_resultset_addref count=%d",
658 r, r->refcount);
660 }
661}
662
663static int g_resultsets = 0;
665
666/* TODO We need to initialize this before running threaded:
667 * call resultset_use(0) */
668
669static int resultset_use(int delta) {
670 int resultset_count;
671 if (g_resultset_mutex == 0)
674 g_resultsets += delta;
675 resultset_count = g_resultsets;
677 return resultset_count;
678}
679
681 return resultset_use(0);
682}
683
685{
686 int i;
687 ZOOM_resultset r = (ZOOM_resultset) xmalloc(sizeof(*r));
688
689 initlog();
690
691 yaz_log(log_details0, "%p ZOOM_resultset_create", r);
692 r->refcount = 1;
693 r->size = 0;
695 r->piggyback = 1;
696 r->setname = 0;
697 r->step = 0;
698 for (i = 0; i<RECORD_HASH_SIZE; i++)
699 r->record_hash[i] = 0;
700 r->r_sort_spec = 0;
701 r->query = 0;
702 r->connection = 0;
703 r->databaseNames = 0;
704 r->num_databaseNames = 0;
705 r->req_facets = 0;
706 r->res_facets = 0;
707 r->num_res_facets = 0;
708 r->facets_names = 0;
709 r->mutex = 0;
711#if SHPTR
712 {
713 WRBUF w = wrbuf_alloc();
714 YAZ_SHPTR_INIT(r->record_wrbuf, w);
715 }
716#endif
717 resultset_use(1);
718 r->mc_key = 0;
719 r->live_set = 0;
720 return r;
721}
722
725{
728
729 ZOOM_query_prefix(s, q);
730
731 r = ZOOM_connection_search(c, s);
733 return r;
734}
735
738{
740 ZOOM_task task;
741 int start, count;
742 const char *syntax, *elementSetName, *schema;
743 yaz_log(c->log_api, "%p ZOOM_connection_search set %p query %p", c, r, q);
745 r->query = q;
747
749
751 ZOOM_options_get(r->options, "facets"));
752 start = ZOOM_options_get_int(r->options, "start", 0);
753 count = ZOOM_options_get_int(r->options, "count", 0);
754 {
755 /* If "presentChunk" is defined use that; otherwise "step" */
756 const char *cp = ZOOM_options_get(r->options, "presentChunk");
758 (cp != 0 ? "presentChunk": "step"), 0);
759 }
760 r->piggyback = ZOOM_options_get_bool(r->options, "piggyback", 1);
762 ZOOM_options_get(r->options, "setname"));
765 r->odr);
766 r->connection = c;
767 r->next = c->resultsets;
768 c->resultsets = r;
769
771
772 if (c->host_port && c->proto == PROTO_HTTP)
773 {
774 if (!c->cs)
775 {
776 yaz_log(c->log_details, "ZOOM_connection_search: no comstack");
778 }
779 else
780 {
781 yaz_log(c->log_details, "ZOOM_connection_search: reconnect");
782 c->reconnect_ok = 1;
783 }
784 }
785
787 task->u.search.resultset = r;
788 task->u.search.start = start;
789 task->u.search.count = count;
790
791 syntax = ZOOM_options_get(r->options, "preferredRecordSyntax");
792 task->u.search.syntax = syntax ? xstrdup(syntax) : 0;
793 elementSetName = ZOOM_options_get(r->options, "elementSetName");
794 task->u.search.elementSetName = elementSetName ?
795 xstrdup(elementSetName) : 0;
796 schema = ZOOM_options_get(r->options, "schema");
797 task->u.search.schema = schema ? xstrdup(schema) : 0;
798
800
801 if (!c->async)
802 {
803 while (ZOOM_event(1, &c))
804 ;
805 }
806 return r;
807}
808
809ZOOM_API(void)
811 const char *sort_type, const char *sort_spec)
812{
813 (void) ZOOM_resultset_sort1(r, sort_type, sort_spec);
814}
815
816ZOOM_API(int)
818 const char *sort_type, const char *sort_spec)
819{
820 ZOOM_connection c = r->connection;
821 ZOOM_task task;
822 ZOOM_query newq;
823
824 newq = ZOOM_query_create();
825 if (ZOOM_query_sortby(newq, sort_spec) < 0)
826 return -1;
827
828 yaz_log(c->log_api, "%p ZOOM_resultset_sort r=%p sort_type=%s sort_spec=%s",
829 r, r, sort_type, sort_spec);
830 if (!c)
831 return 0;
832
833 if (c->host_port && c->proto == PROTO_HTTP)
834 {
835 if (!c->cs)
836 {
837 yaz_log(c->log_details, "%p ZOOM_resultset_sort: no comstack", r);
839 }
840 else
841 {
842 yaz_log(c->log_details, "%p ZOOM_resultset_sort: prepare reconnect",
843 r);
844 c->reconnect_ok = 1;
845 }
846 }
847
850 task->u.sort.resultset = r;
851 task->u.sort.q = newq;
852
854
855 if (!c->async)
856 {
857 while (ZOOM_event(1, &c))
858 ;
859 }
860
861 return 0;
862}
863
864ZOOM_API(void)
869
871{
872 if (!r)
873 return;
875 (r->refcount)--;
876 yaz_log(log_details0, "%p ZOOM_resultset_destroy r=%p count=%d",
877 r, r, r->refcount);
878 if (r->refcount == 0)
879 {
881
882 yaz_log(log_details0, "%p ZOOM_connection resultset_destroy: Deleting resultset (%p) ", r->connection, r);
887 odr_destroy(r->odr);
889#if SHPTR
890 YAZ_SHPTR_DEC(r->record_wrbuf, wrbuf_destroy);
891#endif
893 resultset_use(-1);
894 xfree(r);
895 }
896 else
898}
899
900ZOOM_API(size_t)
902{
903 return r->size;
904}
905
907{
908 ZOOM_Event event;
909
910 if (!c->reconnect_ok)
911 return 0;
913 c->reconnect_ok = 0;
914 c->tasks->running = 0;
916
919
920 return 1;
921}
922
924 int force_sync, int start, int count)
925{
926 ZOOM_task task;
928 const char *cp;
929 const char *syntax, *elementSetName;
930
931 if (!r)
932 return;
933 yaz_log(log_details0, "%p ZOOM_resultset_retrieve force_sync=%d start=%d"
934 " count=%d", r, force_sync, start, count);
935 c = r->connection;
936 if (!c)
937 return;
938
939 if (c->host_port && c->proto == PROTO_HTTP)
940 {
941 if (!c->cs)
942 {
943 yaz_log(log_details0, "%p ZOOM_resultset_retrieve: no comstack", r);
945 }
946 else
947 {
948 yaz_log(log_details0, "%p ZOOM_resultset_retrieve: prepare "
949 "reconnect", r);
950 c->reconnect_ok = 1;
951 }
952 }
954 task->u.search.resultset = r;
955 task->u.search.start = start;
956 task->u.search.count = count;
957
958 syntax = ZOOM_options_get(r->options, "preferredRecordSyntax");
959 task->u.search.syntax = syntax ? xstrdup(syntax) : 0;
960 elementSetName = ZOOM_options_get(r->options, "elementSetName");
961 task->u.search.elementSetName = elementSetName
962 ? xstrdup(elementSetName) : 0;
963
964 cp = ZOOM_options_get(r->options, "schema");
965 task->u.search.schema = cp ? xstrdup(cp) : 0;
966
968
969 if (!r->connection->async || force_sync)
970 while (r->connection && ZOOM_event(1, &r->connection))
971 ;
972}
973
974ZOOM_API(void)
976 size_t start, size_t count)
977{
978 int force_present = 0;
979
980 if (!r)
981 return ;
982 yaz_log(log_api0, "%p ZOOM_resultset_records r=%p start=%ld count=%ld",
983 r, r, (long) start, (long) count);
984 if (count && recs)
985 force_present = 1;
986 ZOOM_resultset_retrieve(r, force_present, start, count);
987 if (force_present)
988 {
989 size_t i;
990 for (i = 0; i< count; i++)
991 recs[i] = ZOOM_resultset_record_immediate(r, i+start);
992 }
993}
994
995ZOOM_API(size_t)
997{
998 return r->num_res_facets;
999}
1000
1003{
1004 int num = r->num_res_facets;
1005 ZOOM_facet_field *facets = r->res_facets;
1006 int i;
1007 for (i = 0; i < num; i++)
1008 if (!strcmp(facets[i]->facet_name, name))
1009 return facets[i];
1010 return 0;
1011}
1012
1015{
1016 int num = r->num_res_facets;
1017 ZOOM_facet_field *facets = r->res_facets;
1018 if (idx >= 0 && idx < num)
1019 return facets[idx];
1020 return 0;
1021}
1022
1025{
1026 return r->res_facets;
1027}
1028
1029ZOOM_API(const char**)
1031{
1032 return (const char **) r->facets_names;
1033}
1034
1035ZOOM_API(const char*)
1037{
1038 return field->facet_name;
1039}
1040
1041ZOOM_API(size_t)
1043{
1044 return field->num_terms;
1045}
1046
1047ZOOM_API(const char*)
1048 ZOOM_facet_field_get_term(ZOOM_facet_field field, size_t idx, int *freq)
1049{
1050 *freq = field->facet_terms[idx].frequency;
1051 return field->facet_terms[idx].term;
1052}
1053
1054
1056{
1057 char *cert_buf;
1058 int cert_len;
1059
1060 if (cs_get_peer_certificate_x509(c->cs, &cert_buf, &cert_len))
1061 {
1062 ZOOM_connection_option_setl(c, "sslPeerCert",
1063 cert_buf, cert_len);
1064 xfree(cert_buf);
1065 }
1066}
1067
1069 const char *logical_url);
1070
1072{
1073 return do_connect_host(c, c->host_port);
1074}
1075
1076static zoom_ret do_connect_host(ZOOM_connection c, const char *logical_url)
1077{
1078 void *add;
1079 int flags = CS_FLAGS_DNS_NO_BLOCK;
1080
1081 if (c->cs)
1082 cs_close(c->cs);
1083
1084 if (c->check_cert)
1085 flags |= CS_FLAGS_CHECK_CERT;
1086 c->cs = cs_create_host2(logical_url, flags, &add,
1087 c->tproxy ? c->tproxy : c->proxy,
1088 &c->proxy_mode);
1089 if (!c->proxy)
1090 c->proxy_mode = 0;
1091
1092 if (c->cs && c->cs->protocol == PROTO_HTTP)
1093 {
1094#if YAZ_HAVE_XML2
1095 c->proto = PROTO_HTTP;
1096#else
1099 return zoom_complete;
1100#endif
1101 }
1102 if (c->cs)
1103 {
1104 const char *cert_fname = ZOOM_options_get(c->options, "cert_fname");
1105 int ret;
1106
1107 if (cert_fname)
1108 cs_set_ssl_certificate_file(c->cs, cert_fname);
1109
1110 ret = cs_connect(c->cs, add);
1111 if (ret == 0)
1112 {
1114 ZOOM_connection_put_event(c, event);
1115 get_cert(c);
1116 if (c->proto == PROTO_Z3950)
1118 else
1119 {
1120 /* no init request for SRW .. */
1121 assert(c->tasks->which == ZOOM_TASK_CONNECT);
1124
1125 if (c->cs && c->location)
1127 else
1129 }
1131 return zoom_pending;
1132 }
1133 else if (ret > 0)
1134 {
1135 int mask = ZOOM_SELECT_EXCEPT;
1136 if (c->cs->io_pending & CS_WANT_WRITE)
1137 mask += ZOOM_SELECT_WRITE;
1138 if (c->cs->io_pending & CS_WANT_READ)
1139 mask += ZOOM_SELECT_READ;
1140 ZOOM_connection_set_mask(c, mask);
1142 return zoom_pending;
1143 }
1144 }
1145 c->state = STATE_IDLE;
1146 ZOOM_set_error(c, ZOOM_ERROR_CONNECT, logical_url);
1147 return zoom_complete;
1148}
1149
1150/* returns 1 if PDU was sent OK (still pending )
1151 0 if PDU was not sent OK (nothing to wait for)
1152*/
1153
1156{
1157 const char *syntax =
1158 ZOOM_options_get(s->options, "preferredRecordSyntax");
1159 const char *elementSetName =
1160 ZOOM_options_get(s->options, "elementSetName");
1161 const char *schema =
1162 ZOOM_options_get(s->options, "schema");
1163
1164 return ZOOM_record_cache_lookup_i(s, pos, syntax, elementSetName, schema);
1165}
1166
1169{
1171
1172 if (!rec)
1173 {
1174 /*
1175 * MIKE: I think force_sync should always be zero, but I don't
1176 * want to make this change until I get the go-ahead from
1177 * Adam, in case something depends on the old synchronous
1178 * behaviour.
1179 */
1180 int force_sync = 1;
1181 if (getenv("ZOOM_RECORD_NO_FORCE_SYNC")) force_sync = 0;
1182 ZOOM_resultset_retrieve(r, force_sync, pos, 1);
1183 rec = ZOOM_resultset_record_immediate(r, pos);
1184 }
1185 return rec;
1186}
1187
1190{
1191 ZOOM_scanset s;
1193
1194 ZOOM_query_prefix(q, start);
1195
1196 s = ZOOM_connection_scan1(c, q);
1198 return s;
1199
1200}
1201
1204{
1205 ZOOM_scanset scan = 0;
1206 Z_Query *z_query = ZOOM_query_get_Z_Query(q);
1207
1208 if (!z_query)
1209 return 0;
1210 scan = (ZOOM_scanset) xmalloc(sizeof(*scan));
1211 scan->connection = c;
1212 scan->odr = odr_createmem(ODR_DECODE);
1213 scan->options = ZOOM_options_create_with_parent(c->options);
1214 scan->refcount = 1;
1215 scan->scan_response = 0;
1216 scan->srw_scan_response = 0;
1217
1218 scan->query = q;
1220 scan->databaseNames = ZOOM_connection_get_databases(c, c->options,
1221 &scan->num_databaseNames,
1222 scan->odr);
1223
1224 if (1)
1225 {
1227 task->u.scan.scan = scan;
1228
1229 (scan->refcount)++;
1230 if (!c->async)
1231 {
1232 while (ZOOM_event(1, &c))
1233 ;
1234 }
1235 }
1236 return scan;
1237}
1238
1239ZOOM_API(void)
1241{
1242 if (!scan)
1243 return;
1244 (scan->refcount)--;
1245 if (scan->refcount == 0)
1246 {
1247 ZOOM_query_destroy(scan->query);
1248
1249 odr_destroy(scan->odr);
1250
1251 ZOOM_options_destroy(scan->options);
1252 xfree(scan);
1253 }
1254}
1255
1257{
1258 ZOOM_Event event;
1259
1260 yaz_log(c->log_details, "%p send_package", c);
1261 if (!c->tasks)
1262 return zoom_complete;
1263 assert (c->tasks->which == ZOOM_TASK_PACKAGE);
1264
1266 ZOOM_connection_put_event(c, event);
1267
1268 c->buf_out = c->tasks->u.package->buf_out;
1269 c->len_out = c->tasks->u.package->len_out;
1270
1271 return ZOOM_send_buf(c);
1272}
1273
1274ZOOM_API(size_t)
1276{
1277 if (!scan)
1278 return 0;
1279
1280 if (scan->scan_response && scan->scan_response->entries)
1281 return scan->scan_response->entries->num_entries;
1282 else if (scan->srw_scan_response)
1283 return scan->srw_scan_response->num_terms;
1284 return 0;
1285}
1286
1287static void ZOOM_scanset_term_x(ZOOM_scanset scan, size_t pos,
1288 size_t *occ,
1289 const char **value_term, size_t *value_len,
1290 const char **disp_term, size_t *disp_len)
1291{
1292 size_t noent = ZOOM_scanset_size(scan);
1293
1294 *value_term = 0;
1295 *value_len = 0;
1296
1297 *disp_term = 0;
1298 *disp_len = 0;
1299
1300 *occ = 0;
1301 if (pos >= noent)
1302 return;
1303 if (scan->scan_response)
1304 {
1305 Z_ScanResponse *res = scan->scan_response;
1306 if (res->entries->entries[pos]->which == Z_Entry_termInfo)
1307 {
1308 Z_TermInfo *t = res->entries->entries[pos]->u.termInfo;
1309
1310 *value_term = (const char *) t->term->u.general->buf;
1311 *value_len = t->term->u.general->len;
1312 if (t->displayTerm)
1313 {
1314 *disp_term = t->displayTerm;
1315 *disp_len = strlen(*disp_term);
1316 }
1317 else if (t->term->which == Z_Term_general)
1318 {
1319 *disp_term = (const char *) t->term->u.general->buf;
1320 *disp_len = t->term->u.general->len;
1321 }
1322 *occ = t->globalOccurrences ? *t->globalOccurrences : 0;
1323 }
1324 }
1325 if (scan->srw_scan_response)
1326 {
1328 Z_SRW_scanTerm *t = res->terms + pos;
1329 if (t)
1330 {
1331 *value_term = t->value;
1332 *value_len = strlen(*value_term);
1333
1334 if (t->displayTerm)
1335 *disp_term = t->displayTerm;
1336 else
1337 *disp_term = t->value;
1338 *disp_len = strlen(*disp_term);
1339 *occ = t->numberOfRecords ? *t->numberOfRecords : 0;
1340 }
1341 }
1342}
1343
1344ZOOM_API(const char *)
1346 size_t *occ, size_t *len)
1347{
1348 const char *value_term = 0;
1349 size_t value_len = 0;
1350 const char *disp_term = 0;
1351 size_t disp_len = 0;
1352
1353 ZOOM_scanset_term_x(scan, pos, occ, &value_term, &value_len,
1354 &disp_term, &disp_len);
1355
1356 *len = value_len;
1357 return value_term;
1358}
1359
1360ZOOM_API(const char *)
1362 size_t *occ, size_t *len)
1363{
1364 const char *value_term = 0;
1365 size_t value_len = 0;
1366 const char *disp_term = 0;
1367 size_t disp_len = 0;
1368
1369 ZOOM_scanset_term_x(scan, pos, occ, &value_term, &value_len,
1370 &disp_term, &disp_len);
1371
1372 *len = disp_len;
1373 return disp_term;
1374}
1375
1376ZOOM_API(const char *)
1378{
1379 return ZOOM_options_get(scan->options, key);
1380}
1381
1382ZOOM_API(void)
1384 const char *val)
1385{
1386 ZOOM_options_set(scan->options, key, val);
1387}
1388
1389
1392{
1393 ZOOM_package p = (ZOOM_package) xmalloc(sizeof(*p));
1394
1395 p->connection = c;
1398 p->refcount = 1;
1399 p->buf_out = 0;
1400 p->len_out = 0;
1401 return p;
1402}
1403
1404ZOOM_API(void)
1406{
1407 if (!p)
1408 return;
1409 (p->refcount)--;
1410 if (p->refcount == 0)
1411 {
1412 odr_destroy(p->odr_out);
1413 xfree(p->buf_out);
1414
1415 ZOOM_options_destroy(p->options);
1416 xfree(p);
1417 }
1418}
1419
1420ZOOM_API(const char *)
1422{
1423 return ZOOM_options_get(p->options, key);
1424}
1425
1426ZOOM_API(const char *)
1427 ZOOM_package_option_getl(ZOOM_package p, const char *key, int *lenp)
1428{
1429 return ZOOM_options_getl(p->options, key, lenp);
1430}
1431
1432ZOOM_API(void)
1434 const char *val)
1435{
1436 ZOOM_options_set(p->options, key, val);
1437}
1438
1439ZOOM_API(void)
1441 const char *val, int len)
1442{
1443 ZOOM_options_setl(p->options, key, val, len);
1444}
1445
1446ZOOM_API(int)
1448{
1449 ZOOM_task task = c->tasks;
1450 zoom_ret ret = zoom_complete;
1451
1452 if (!task)
1453 return 0;
1454 yaz_log(c->log_details, "%p ZOOM_connection_exec_task type=%d run=%d",
1455 c, task->which, task->running);
1456 if (c->error != ZOOM_ERROR_NONE)
1457 {
1458 yaz_log(c->log_details, "%p ZOOM_connection_exec_task "
1459 "removing tasks because of error = %d", c, c->error);
1461 return 0;
1462 }
1463 if (task->running)
1464 {
1465 yaz_log(c->log_details, "%p ZOOM_connection_exec_task "
1466 "task already running", c);
1467 return 0;
1468 }
1469 task->running = 1;
1470 ret = zoom_complete;
1471 if (c->cs || task->which == ZOOM_TASK_CONNECT)
1472 {
1473 switch (task->which)
1474 {
1475 case ZOOM_TASK_SEARCH:
1476 if (c->proto == PROTO_HTTP)
1478 else
1480 break;
1481 case ZOOM_TASK_CONNECT:
1482 ret = do_connect(c);
1483 break;
1484 case ZOOM_TASK_SCAN:
1485 if (c->proto == PROTO_HTTP)
1487 else
1489 break;
1490 case ZOOM_TASK_PACKAGE:
1491 ret = send_package(c);
1492 break;
1493 case ZOOM_TASK_SORT:
1494 c->tasks->u.sort.resultset->r_sort_spec =
1495 ZOOM_query_get_sortspec(c->tasks->u.sort.q);
1496 ret = send_Z3950_sort(c, c->tasks->u.sort.resultset);
1497 break;
1498 }
1499 }
1500 else
1501 {
1502 yaz_log(c->log_details, "%p ZOOM_connection_exec_task "
1503 "remove tasks because no connection exist", c);
1505 }
1506 if (ret == zoom_complete)
1507 {
1508 yaz_log(c->log_details, "%p ZOOM_connection_exec_task "
1509 "task removed (complete)", c);
1511 return 0;
1512 }
1513 yaz_log(c->log_details, "%p ZOOM_connection_exec_task "
1514 "task pending", c);
1515 return 1;
1516}
1517
1518
1520{
1521 Z_GDU *gdu = z_get_HTTP_Request_uri(c->odr_out, uri, 0, c->proxy ? 1 : 0);
1522
1523 gdu->u.HTTP_Request->method = odr_strdup(c->odr_out, "GET");
1524 z_HTTP_header_add(c->odr_out, &gdu->u.HTTP_Request->headers, "Accept",
1525 "text/xml");
1526 yaz_cookies_request(c->cookies, c->odr_out, gdu->u.HTTP_Request);
1527 if (c->user && c->password)
1528 {
1529 z_HTTP_header_add_basic_auth(c->odr_out, &gdu->u.HTTP_Request->headers,
1530 c->user, c->password);
1531 }
1532 xfree(c->location);
1533 c->location = 0;
1534 return ZOOM_send_GDU(c, gdu);
1535}
1536
1537
1539{
1540 ZOOM_Event event;
1541
1542 int r = z_GDU(c->odr_out, &gdu, 0, 0);
1543 if (!r)
1544 return zoom_complete;
1545 if (c->odr_print)
1546 z_GDU(c->odr_print, &gdu, 0, 0);
1547 if (c->odr_save)
1548 z_GDU(c->odr_save, &gdu, 0, 0);
1549 c->buf_out = odr_getbuf(c->odr_out, &c->len_out, 0);
1550 odr_reset(c->odr_out);
1551
1553 ZOOM_connection_put_event(c, event);
1554
1555 return ZOOM_send_buf(c);
1556}
1557
1559 const char *addinfo, const char *addinfo2)
1560{
1561 ZOOM_set_dset_error(c, error, "HTTP", addinfo, addinfo2);
1562}
1563
1564#if YAZ_HAVE_XML2
1566{
1567 zoom_ret cret = zoom_complete;
1568 int ret = -1;
1569 char *addinfo = 0;
1570 const char *connection_head = z_HTTP_header_lookup(hres->headers,
1571 "Connection");
1572 int must_close = 0;
1573 const char *location;
1574
1576 yaz_log(c->log_details, "%p handle_http", c);
1577 if (!strcmp(hres->version, "1.0"))
1578 {
1579 /* HTTP 1.0: only if Keep-Alive we stay alive.. */
1580 if (!connection_head || strcmp(connection_head, "Keep-Alive"))
1581 must_close = 1;
1582 }
1583 else
1584 {
1585 /* HTTP 1.1: only if no close we stay alive.. */
1586 if (connection_head && !strcmp(connection_head, "close"))
1587 must_close = 1;
1588 }
1589 yaz_cookies_response(c->cookies, hres);
1590 if ((hres->code == 301 || hres->code == 302) && c->sru_mode == zoom_sru_get
1591 && (location = z_HTTP_header_lookup(hres->headers, "Location")))
1592 {
1593 c->no_redirects++;
1594 if (c->no_redirects > 10)
1595 {
1596 ZOOM_set_HTTP_error(c, hres->code, 0, 0);
1597 c->no_redirects = 0;
1599 }
1600 else
1601 {
1602 /* since redirect may change host we just reconnect. A smarter
1603 implementation might check whether it's the same server */
1604
1605 int host_change = 0;
1606 location = yaz_check_location(c->odr_in, c->host_port,
1607 location, &host_change);
1608 xfree(c->location);
1609 c->location = xstrdup(location);
1610 do_connect_host(c, location);
1611 return;
1612 }
1613 }
1614 else
1615 {
1616 ret = ZOOM_handle_sru(c, hres, &cret, &addinfo);
1617 if (ret == 0)
1618 {
1619 if (c->no_redirects) /* end of redirect. change hosts again */
1621 }
1622 c->no_redirects = 0;
1623 }
1624 if (ret)
1625 {
1626 if (hres->code != 200)
1627 ZOOM_set_HTTP_error(c, hres->code, 0, 0);
1628 else
1629 {
1630 yaz_log(YLOG_LOG, "set error... addinfo=%s", addinfo ?
1631 addinfo : "NULL");
1632 ZOOM_set_error(c, ZOOM_ERROR_DECODE, addinfo);
1633 }
1635 }
1636 if (cret == zoom_complete)
1637 {
1638 yaz_log(c->log_details, "removing tasks in handle_http");
1640 }
1641 if (must_close)
1642 {
1644 if (c->tasks)
1645 {
1646 c->tasks->running = 0;
1648 c->reconnect_ok = 0;
1649 }
1650 }
1651 else
1652 c->reconnect_ok = 1; /* if the server closes anyway */
1653}
1654#endif
1655
1657{
1658 int r;
1659 ZOOM_Event event;
1660
1662 ZOOM_connection_put_event(c, event);
1663
1664 r = cs_get(c->cs, &c->buf_in, &c->len_in);
1665 yaz_log(c->log_details, "%p do_read r=%d", c, r);
1666 if (r == 1)
1667 return 0;
1668 if (r < 0 && (c->cs->cerrno == CSPROTERR || c->cs->cerrno == CSBUFSIZE))
1669 {
1670 char msg[100];
1671 yaz_snprintf(msg, sizeof(msg), "%s: %s",
1672 c->host_port, cs_errmsg(cs_errno(c->cs)));
1675 }
1676 else if (r <= 0)
1677 {
1678 if (!ZOOM_test_reconnect(c))
1679 {
1682 }
1683 }
1684 else
1685 {
1686 Z_GDU *gdu;
1687 ZOOM_Event event;
1688
1689 odr_reset(c->odr_in);
1690 odr_setbuf(c->odr_in, c->buf_in, r, 0);
1692 ZOOM_connection_put_event(c, event);
1693
1694 if (!z_GDU(c->odr_in, &gdu, 0, 0))
1695 {
1696 /* even on failures we try to re-connect (HTTP) */
1697 if (!ZOOM_test_reconnect(c))
1698 {
1699 int x;
1700 int err = odr_geterrorx(c->odr_in, &x);
1701 char msg[100];
1702 const char *element = odr_getelement(c->odr_in);
1703 yaz_snprintf(msg, sizeof(msg),
1704 "ODR code %d:%d element=%s offset=%d",
1705 err, x, element ? element : "<unknown>",
1706 odr_offset(c->odr_in));
1708 if (c->log_api)
1709 {
1710 FILE *ber_file = yaz_log_file();
1711 if (ber_file)
1712 odr_dumpBER(ber_file, c->buf_in, r);
1713 }
1715 }
1716 }
1717 else
1718 {
1719 if (c->odr_print)
1720 z_GDU(c->odr_print, &gdu, 0, 0);
1721 if (c->odr_save)
1722 z_GDU(c->odr_save, &gdu, 0, 0);
1723 if (gdu->which == Z_GDU_Z3950)
1724 ZOOM_handle_Z3950_apdu(c, gdu->u.z3950);
1725 else if (gdu->which == Z_GDU_HTTP_Response)
1726 {
1727#if YAZ_HAVE_XML2
1728 handle_http(c, gdu->u.HTTP_Response);
1729#else
1732#endif
1733 }
1734 }
1735 }
1736 return 1;
1737}
1738
1739static zoom_ret do_write_ex(ZOOM_connection c, char *buf_out, int len_out)
1740{
1741 int r;
1742 ZOOM_Event event;
1743
1745 ZOOM_connection_put_event(c, event);
1746
1747 yaz_log(c->log_details, "%p do_write_ex len=%d", c, len_out);
1748 if ((r = cs_put(c->cs, buf_out, len_out)) < 0)
1749 {
1750 yaz_log(c->log_details, "%p do_write_ex write failed", c);
1751 if (ZOOM_test_reconnect(c))
1752 {
1753 return zoom_pending;
1754 }
1755 if (c->state == STATE_CONNECTING)
1757 else
1760 return zoom_complete;
1761 }
1762 else if (r == 1)
1763 {
1764 int mask = ZOOM_SELECT_EXCEPT;
1765 if (c->cs->io_pending & CS_WANT_WRITE)
1766 mask += ZOOM_SELECT_WRITE;
1767 if (c->cs->io_pending & CS_WANT_READ)
1768 mask += ZOOM_SELECT_READ;
1769 ZOOM_connection_set_mask(c, mask);
1770 yaz_log(c->log_details, "%p do_write_ex write incomplete mask=%d",
1771 c, c->mask);
1772 }
1773 else
1774 {
1776 yaz_log(c->log_details, "%p do_write_ex write complete mask=%d",
1777 c, c->mask);
1778 }
1779 return zoom_pending;
1780}
1781
1783{
1784 return do_write_ex(c, c->buf_out, c->len_out);
1785}
1786
1787
1788ZOOM_API(const char *)
1790{
1791 if (!strcmp(key, "APDU"))
1792 {
1793 return c->saveAPDU_wrbuf ? wrbuf_cstr(c->saveAPDU_wrbuf) : "";
1794 }
1795 else
1796 return ZOOM_options_get(c->options, key);
1797}
1798
1799ZOOM_API(const char *)
1800 ZOOM_connection_option_getl(ZOOM_connection c, const char *key, int *lenp)
1801{
1802 if (!strcmp(key, "APDU"))
1803 {
1804 if (c->saveAPDU_wrbuf)
1805 {
1806 *lenp = wrbuf_len(c->saveAPDU_wrbuf);
1807 return wrbuf_cstr(c->saveAPDU_wrbuf);
1808 }
1809 else
1810 {
1811 *lenp = 0;
1812 return "";
1813 }
1814 }
1815 else
1816 return ZOOM_options_getl(c->options, key, lenp);
1817}
1818
1819ZOOM_API(void)
1821 const char *val)
1822{
1823 if (!strcmp(key, "saveAPDU"))
1824 {
1825 if (val && strcmp(val, "0"))
1826 {
1827 if (!c->saveAPDU_wrbuf)
1828 c->saveAPDU_wrbuf = wrbuf_alloc();
1829 else
1830 wrbuf_rewind(c->saveAPDU_wrbuf);
1831 }
1832 else
1833 {
1834 wrbuf_destroy(c->saveAPDU_wrbuf);
1835 c->saveAPDU_wrbuf = 0;
1836 }
1837 ZOOM_connection_save_apdu_wrbuf(c, c->saveAPDU_wrbuf);
1838 }
1839 else
1840 ZOOM_options_set(c->options, key, val);
1841}
1842
1843ZOOM_API(void)
1845 const char *val, int len)
1846{
1847 ZOOM_options_setl(c->options, key, val, len);
1848}
1849
1850ZOOM_API(const char *)
1852{
1853 return ZOOM_options_get(r->options, key);
1854}
1855
1856ZOOM_API(void)
1858 const char *val)
1859{
1860 ZOOM_options_set(r->options, key, val);
1861}
1862
1863
1864ZOOM_API(int)
1869
1870ZOOM_API(const char *)
1872{
1873 const char *msg;
1874 ZOOM_connection_error(c, &msg, 0);
1875 return msg;
1876}
1877
1878ZOOM_API(const char *)
1880{
1881 const char *addinfo;
1882 ZOOM_connection_error(c, 0, &addinfo);
1883 return addinfo;
1884}
1885
1886ZOOM_API(const char *)
1888{
1889 const char *diagset;
1890 ZOOM_connection_error_x(c, 0, 0, &diagset);
1891 return diagset;
1892}
1893
1894ZOOM_API(const char *)
1895 ZOOM_diag_str(int error)
1896{
1897 switch (error)
1898 {
1899 case ZOOM_ERROR_NONE:
1900 return "No error";
1901 case ZOOM_ERROR_CONNECT:
1902 return "Connect failed";
1903 case ZOOM_ERROR_MEMORY:
1904 return "Out of memory";
1905 case ZOOM_ERROR_ENCODE:
1906 return "Encoding failed";
1907 case ZOOM_ERROR_DECODE:
1908 return "Decoding failed";
1910 return "Connection lost";
1911 case ZOOM_ERROR_INIT:
1912 return "Init rejected";
1914 return "Internal failure";
1915 case ZOOM_ERROR_TIMEOUT:
1916 return "Timeout";
1918 return "Unsupported protocol";
1920 return "Unsupported query type";
1922 return "Invalid query";
1924 return "CQL parsing error";
1926 return "CQL transformation error";
1928 return "CCL configuration error";
1930 return "CCL parsing error";
1932 return "Extended Service. invalid action";
1934 return "Extended Service. invalid version";
1936 return "Extended Service. invalid syntax";
1938 return "Memcached";
1939 default:
1940 return diagbib1_str(error);
1941 }
1942}
1943
1944ZOOM_API(int)
1946 const char **addinfo, const char **diagset)
1947{
1948 int error = c->error;
1949 if (cp)
1950 {
1951 if (!c->diagset || !strcmp(c->diagset, "ZOOM"))
1952 *cp = ZOOM_diag_str(error);
1953 else if (!strcmp(c->diagset, "HTTP"))
1954 *cp = z_HTTP_errmsg(c->error);
1955 else if (!strcmp(c->diagset, "Bib-1"))
1956 *cp = ZOOM_diag_str(error);
1957 else if (!strcmp(c->diagset, "info:srw/diagnostic/1"))
1958 *cp = yaz_diag_srw_str(c->error);
1959 else
1960 *cp = "Unknown error and diagnostic set";
1961 }
1962 if (addinfo)
1963 *addinfo = c->addinfo ? c->addinfo : "";
1964 if (diagset)
1965 *diagset = c->diagset ? c->diagset : "";
1966 return c->error;
1967}
1968
1969ZOOM_API(int)
1971 const char **addinfo)
1972{
1973 return ZOOM_connection_error_x(c, cp, addinfo, 0);
1974}
1975
1977{
1978 ZOOM_Event event = 0;
1979 int r = cs_look(c->cs);
1980 yaz_log(c->log_details, "%p ZOOM_connection_do_io mask=%d cs_look=%d",
1981 c, mask, r);
1982
1983 if (r == CS_NONE)
1984 {
1988 ZOOM_connection_put_event(c, event);
1989 }
1990 else if (r == CS_CONNECT)
1991 {
1992 int ret = cs_rcvconnect(c->cs);
1993 yaz_log(c->log_details, "%p ZOOM_connection_do_io "
1994 "cs_rcvconnect returned %d", c, ret);
1995 if (ret == 1)
1996 {
1997 int mask = ZOOM_SELECT_EXCEPT;
1998 if (c->cs->io_pending & CS_WANT_WRITE)
1999 mask += ZOOM_SELECT_WRITE;
2000 if (c->cs->io_pending & CS_WANT_READ)
2001 mask += ZOOM_SELECT_READ;
2002 ZOOM_connection_set_mask(c, mask);
2004 ZOOM_connection_put_event(c, event);
2005 }
2006 else if (ret == 0)
2007 {
2009 ZOOM_connection_put_event(c, event);
2010 get_cert(c);
2011 if (c->proto == PROTO_Z3950)
2013 else
2014 {
2015 /* no init request for SRW .. */
2016 if (c->tasks->which == ZOOM_TASK_CONNECT)
2017 {
2020 }
2021 if (c->cs && c->location)
2023 else
2025 }
2026 if (c->cs && cs_look(c->cs) == CS_DATA)
2028 }
2029 else
2030 {
2033 }
2034 }
2035 else
2036 {
2037 if (mask & ZOOM_SELECT_EXCEPT)
2038 {
2039 if (!ZOOM_test_reconnect(c))
2040 {
2043 }
2044 return;
2045 }
2046 if (mask & ZOOM_SELECT_READ)
2047 do_read(c);
2048 if (c->cs && (mask & ZOOM_SELECT_WRITE))
2049 ZOOM_send_buf(c);
2050 }
2051}
2052
2053ZOOM_API(int)
2055{
2056 if (!cs)
2057 return ZOOM_EVENT_NONE;
2058 return cs->last_event;
2059}
2060
2061
2063{
2064 if (c->mask)
2065 {
2067 /* timeout and this connection was waiting */
2070 ZOOM_connection_put_event(c, event);
2071 }
2072 return 0;
2073}
2074
2075ZOOM_API(int)
2077{
2078 ZOOM_Event event;
2079 if (!c)
2080 return 0;
2081
2082 event = ZOOM_connection_get_event(c);
2083 if (event)
2084 {
2085 ZOOM_Event_destroy(event);
2086 return 1;
2087 }
2089 event = ZOOM_connection_get_event(c);
2090 if (event)
2091 {
2092 ZOOM_Event_destroy(event);
2093 return 1;
2094 }
2095 return 0;
2096}
2097
2098ZOOM_API(int)
2100{
2101 int i;
2102
2103 yaz_log(log_details0, "ZOOM_process_event(no=%d,cs=%p)", no, cs);
2104
2105 for (i = 0; i<no; i++)
2106 {
2107 ZOOM_connection c = cs[i];
2108
2109 if (c && ZOOM_connection_process(c))
2110 return i+1;
2111 }
2112 return 0;
2113}
2114
2116{
2117 if (c->mask && mask)
2118 ZOOM_connection_do_io(c, mask);
2119 return 0;
2120}
2121
2123{
2124 if (c->cs)
2125 return cs_fileno(c->cs);
2126 return -1;
2127}
2128
2130{
2131 c->mask = mask;
2132 if (!c->cs)
2133 return -1;
2134 return 0;
2135}
2136
2138{
2139 if (c->cs)
2140 return c->mask;
2141 return 0;
2142}
2143
2145{
2146 return ZOOM_options_get_int(c->options, "timeout", 30);
2147}
2148
2150{
2151 if (c->cs)
2152 cs_close(c->cs);
2153 c->cs = 0;
2155 c->state = STATE_IDLE;
2156}
2157
2158/*
2159 * Local variables:
2160 * c-basic-offset: 4
2161 * c-file-style: "Stroustrup"
2162 * indent-tabs-mode: nil
2163 * End:
2164 * vim: shiftwidth=4 tabstop=8 expandtab
2165 */
2166
Header for Z39.50 Charset negotiation utilities.
COMSTACK cs_create_host2(const char *vhost, int flags, void **vp, const char *proxy_host, int *proxy_mode)
Creates an endpoint and selects direct or proxy connection handling.
Definition comstack.c:189
void cs_get_host_args(const char *type_and_host, const char **args)
Extracts application arguments from a host or URI specification.
Definition comstack.c:58
int cs_look(COMSTACK cs)
Returns the last recorded event (CS_NONE, CS_CONNECT, etc.).
Definition comstack.c:280
const char * cs_errmsg(int n)
Returns a static message for a COMSTACK error code.
Definition comstack.c:39
#define cs_close(handle)
Closes the socket and frees the endpoint and its transport state.
Definition comstack.h:223
#define cs_connect(handle, address)
Starts an outgoing connection.
Definition comstack.h:171
#define CS_DATA
Definition comstack.h:99
#define cs_errno(handle)
Returns the last COMSTACK error code.
Definition comstack.h:258
#define cs_put(handle, buf, size)
Sends a complete message.
Definition comstack.h:143
#define CSPROTERR
Definition comstack.h:555
#define CS_WANT_READ
Definition comstack.h:302
#define CS_NONE
Definition comstack.h:91
#define CS_CONNECT
Definition comstack.h:93
#define cs_get(handle, buf, size)
Receives a BER or HTTP message.
Definition comstack.h:155
#define CS_FLAGS_CHECK_CERT
Definition comstack.h:566
#define cs_fileno(handle)
Returns the socket descriptor, or -1 if none has been created.
Definition comstack.h:247
#define CSBUFSIZE
Definition comstack.h:553
#define CS_FLAGS_DNS_NO_BLOCK
Definition comstack.h:564
#define CS_WANT_WRITE
Definition comstack.h:304
#define cs_rcvconnect(handle)
Continues a pending outgoing connection, including TLS or CONNECT.
Definition comstack.h:176
void yaz_cookies_destroy(yaz_cookies_t yc)
Definition cookie.c:35
yaz_cookies_t yaz_cookies_create(void)
Definition cookie.c:28
void yaz_cookies_request(yaz_cookies_t yc, ODR odr, Z_HTTP_Request *req)
Definition cookie.c:98
void yaz_cookies_response(yaz_cookies_t yc, Z_HTTP_Response *res)
Definition cookie.c:60
const char * diagbib1_str(int code)
Definition diagbib1.c:192
Diagnostics: Generated by csvtodiag.tcl from ./bib1.csv.
const char * yaz_diag_srw_str(int code)
Definition diagsrw.c:110
int odr_dumpBER(FILE *f, const char *buf, int len)
Definition dumpber.c:130
Header for errno utilities.
static int log_level_initialized
Definition eventl.c:40
Header for the facet utilities.
void z_HTTP_header_add_basic_auth(ODR o, Z_HTTP_Header **hp, const char *username, const char *password)
Definition http.c:135
const char * z_HTTP_errmsg(int code)
Definition http.c:354
const char * yaz_check_location(ODR odr, const char *uri, const char *location, int *host_change)
Definition http.c:664
const char * z_HTTP_header_lookup(const Z_HTTP_Header *hp, const char *n)
Definition http.c:196
Z_GDU * z_get_HTTP_Request_uri(ODR odr, const char *uri, const char *args, int use_full_uri)
Definition http.c:254
void z_HTTP_header_add(ODR o, Z_HTTP_Header **hp, const char *n, const char *v)
Definition http.c:152
void yaz_log(int level, const char *fmt,...)
Writes log message.
Definition log.c:487
int yaz_log_module_level(const char *name)
returns level for module
Definition log.c:586
FILE * yaz_log_file(void)
returns FILE handle for log or NULL if no file is in use
Definition log.c:138
Logging utility.
#define YLOG_LOG
log level: log (regular)
Definition log.h:48
int yaz_matchstr(const char *s1, const char *s2)
match strings - independent of case and '-'
Definition matchstr.c:42
void yaz_mutex_leave(YAZ_MUTEX p)
leave critical section / AKA unlock
Definition mutex.c:123
void yaz_mutex_enter(YAZ_MUTEX p)
enter critical section / AKA lock
Definition mutex.c:72
void yaz_mutex_create(YAZ_MUTEX *p)
create MUTEX
Definition mutex.c:43
void yaz_mutex_destroy(YAZ_MUTEX *p)
destroy MUTEX
Definition mutex.c:141
struct yaz_mutex * YAZ_MUTEX
YAZ MUTEX opaque pointer.
Definition mutex.h:42
void nmem_strsplit(NMEM nmem, const char *delim, const char *dstr, char ***darray, int *num)
allocates sub strings out of string using certain delimitors
Definition nmemsdup.c:62
void odr_setprint_noclose(ODR o, FILE *file)
Definition odr.c:167
const char * odr_getelement(ODR o)
Definition odr.c:90
int odr_geterrorx(ODR o, int *x)
Definition odr.c:83
char * odr_getbuf(ODR o, int *len, int *size)
Definition odr.c:276
int odr_offset(ODR o)
Definition odr.c:284
ODR odr_createmem(int direction)
Definition odr.c:198
void odr_setbuf(ODR o, char *buf, int len, int can_grow)
Definition odr.c:266
void odr_setprint(ODR o, FILE *file)
Definition odr.c:162
void odr_set_stream(ODR o, void *handle, void(*stream_write)(ODR o, void *handle, int type, const char *buf, int len), void(*stream_close)(void *handle))
Definition odr.c:172
void odr_destroy(ODR o)
Definition odr.c:252
void odr_reset(ODR o)
Definition odr.c:224
#define ODR_DECODE
Definition odr.h:95
#define odr_getmem(o)
Definition odr.h:216
struct odr * ODR
Definition odr.h:121
#define ODR_PRINT
Definition odr.h:97
#define ODR_ENCODE
Definition odr.h:96
char * odr_strdup(ODR o, const char *str)
Definition odr_mem.c:36
char * odr_strdup_null(ODR o, const char *str)
Definition odr_mem.c:41
@ PROTO_HTTP
Definition oid_util.h:48
@ PROTO_Z3950
Definition oid_util.h:47
int options(const char *desc, char **argv, int argc, char **arg)
command-line options parsing for main
Definition options.c:21
Header for Z39.50 OtherInfo utilities.
Query to WRBUF (to strings).
Shared pointer macros.
#define YAZ_SHPTR_INIT(p, n)
Definition shptr.h:50
#define YAZ_SHPTR_DEC(p, destroy)
Definition shptr.h:64
#define YAZ_SHPTR_TYPE(type)
Definition shptr.h:41
void yaz_snprintf(char *buf, size_t size, const char *fmt,...)
Definition snprintf.c:31
Header for config file reading utilities.
char * diagset
Definition zoom-p.h:71
char * tproxy
Definition zoom-p.h:85
int preferred_message_size
Definition zoom-p.h:105
char * charset
Definition zoom-p.h:88
char * buf_out
Definition zoom-p.h:82
char * sru_version
Definition zoom-p.h:93
char * client_IP
Definition zoom-p.h:92
ZOOM_Event m_queue_back
Definition zoom-p.h:111
ZOOM_Event m_queue_front
Definition zoom-p.h:110
char * password
Definition zoom-p.h:97
ZOOM_resultset resultsets
Definition zoom-p.h:109
char * cookie_out
Definition zoom-p.h:90
char * cookie_in
Definition zoom-p.h:91
ZOOM_options options
Definition zoom-p.h:108
enum oid_proto proto
Definition zoom-p.h:66
zoom_sru_mode sru_mode
Definition zoom-p.h:112
COMSTACK cs
Definition zoom-p.h:67
ZOOM_task tasks
Definition zoom-p.h:107
int support_named_resultsets
Definition zoom-p.h:101
int maximum_record_size
Definition zoom-p.h:104
char * host_port
Definition zoom-p.h:68
WRBUF saveAPDU_wrbuf
Definition zoom-p.h:119
char * addinfo
Definition zoom-p.h:70
int url_authentication
Definition zoom-p.h:98
yaz_cookies_t cookies
Definition zoom-p.h:114
char * location
Definition zoom-p.h:115
char * buf_in
Definition zoom-p.h:80
ZOOM_options options
Definition zoom-p.h:188
char * buf_out
Definition zoom-p.h:190
ZOOM_connection connection
Definition zoom-p.h:189
int num_databaseNames
Definition zoom-p.h:147
char ** facets_names
Definition zoom-p.h:156
ZOOM_query query
Definition zoom-p.h:136
ZOOM_options options
Definition zoom-p.h:144
char * req_facets
Definition zoom-p.h:153
ZOOM_resultset next
Definition zoom-p.h:152
ZOOM_facet_field * res_facets
Definition zoom-p.h:154
Odr_int size
Definition zoom-p.h:138
char * setname
Definition zoom-p.h:141
YAZ_MUTEX mutex
Definition zoom-p.h:148
Z_SortKeySpecList * r_sort_spec
Definition zoom-p.h:135
char ** databaseNames
Definition zoom-p.h:146
ZOOM_record_cache record_hash[RECORD_HASH_SIZE]
Definition zoom-p.h:143
ZOOM_connection connection
Definition zoom-p.h:145
int num_databaseNames
Definition zoom-p.h:182
ZOOM_query query
Definition zoom-p.h:177
Z_SRW_scanResponse * srw_scan_response
Definition zoom-p.h:179
char ** databaseNames
Definition zoom-p.h:181
ZOOM_connection connection
Definition zoom-p.h:176
ZOOM_options options
Definition zoom-p.h:175
Z_ScanResponse * scan_response
Definition zoom-p.h:178
int running
Definition zoom-p.h:195
union ZOOM_task_p::@010047006325342334307205147377254122376223002123 u
ZOOM_task next
Definition zoom-p.h:220
int which
Definition zoom-p.h:196
union Z_Entry::@047162227127265375175266224304035330122207254241 u
int which
Definition z-core.h:982
Definition zgdu.h:68
int which
Definition zgdu.h:69
union Z_GDU::@057307356220171136236350364324260103365227025100 u
Z_HTTP_Header * headers
Definition zgdu.h:60
char * version
Definition zgdu.h:59
Z_Entry ** entries
Definition z-core.h:976
Z_SRW_scanTerm * terms
Definition srw.h:146
char * displayTerm
Definition srw.h:141
Odr_int * numberOfRecords
Definition srw.h:140
char * value
Definition srw.h:139
Z_ListEntries * entries
Definition z-core.h:969
Odr_int * globalOccurrences
Definition z-core.h:997
Z_Term * term
Definition z-core.h:992
Z_InternationalString * displayTerm
Definition z-core.h:993
union Z_Term::@023217361022206241314262227377164117366363003164 u
int which
Definition z-core.h:537
unsigned io_pending
Definition comstack.h:88
int cerrno
Definition comstack.h:67
enum oid_proto protocol
Definition comstack.h:100
Definition odr.h:125
int cs_set_ssl_certificate_file(COMSTACK cs, const char *fname)
Selects certificate and private key files for a TLS endpoint.
Definition tcpip.c:1698
int cs_get_peer_certificate_x509(COMSTACK cs, char **buf, int *len)
Gets a human-readable description of the first peer X.509 certificate.
Definition tcpip.c:1733
void wrbuf_destroy(WRBUF b)
destroy WRBUF and its buffer
Definition wrbuf.c:38
const char * wrbuf_cstr(WRBUF b)
returns WRBUF content as C-string
Definition wrbuf.c:299
void wrbuf_rewind(WRBUF b)
empty WRBUF content (length of buffer set to 0)
Definition wrbuf.c:47
WRBUF wrbuf_alloc(void)
construct WRBUF
Definition wrbuf.c:25
void wrbuf_printf(WRBUF b, const char *fmt,...)
writes printf result to WRBUF
Definition wrbuf.c:189
void wrbuf_write(WRBUF b, const char *buf, size_t size)
append constant size buffer to WRBUF
Definition wrbuf.c:68
#define wrbuf_len(b)
Definition wrbuf.h:269
struct wrbuf * WRBUF
Header for memory handling functions.
#define xstrdup(s)
utility macro which calls xstrdup_f
Definition xmalloc.h:55
#define xfree(x)
utility macro which calls xfree_f
Definition xmalloc.h:53
#define xmalloc(x)
utility macro which calls malloc_f
Definition xmalloc.h:49
Header for common YAZ utilities.
#define Z_Term_general
Definition z-core.h:547
#define Z_Entry_termInfo
Definition z-core.h:986
#define Z_GDU_Z3950
Definition zgdu.h:65
#define Z_GDU_HTTP_Response
Definition zgdu.h:67
int z_GDU(ODR o, Z_GDU **p, int opt, const char *name)
Definition zgdu.c:17
char ** ZOOM_connection_get_databases(ZOOM_connection con, ZOOM_options options, int *num, ODR odr)
Definition zoom-c.c:323
static void clear_error(ZOOM_connection c)
Definition zoom-c.c:103
static int g_resultsets
Definition zoom-c.c:663
static void resultset_destroy(ZOOM_resultset r)
Definition zoom-c.c:870
static zoom_ret send_HTTP_redirect(ZOOM_connection c, const char *uri)
Definition zoom-c.c:1519
zoom_ret ZOOM_send_GDU(ZOOM_connection c, Z_GDU *gdu)
Definition zoom-c.c:1538
static int do_read(ZOOM_connection c)
Definition zoom-c.c:1656
ZOOM_task ZOOM_connection_insert_task(ZOOM_connection c, int which)
Definition zoom-c.c:171
zoom_ret ZOOM_send_buf(ZOOM_connection c)
Definition zoom-c.c:1782
static zoom_ret send_package(ZOOM_connection c)
Definition zoom-c.c:1256
static zoom_sru_mode get_sru_mode_from_string(const char *s)
Definition zoom-c.c:346
static void handle_http(ZOOM_connection c, Z_HTTP_Response *hres)
Definition zoom-c.c:1565
static void get_cert(ZOOM_connection c)
Definition zoom-c.c:1055
static void ZOOM_connection_do_io(ZOOM_connection c, int mask)
Definition zoom-c.c:1976
int ZOOM_uri_to_code(const char *uri)
Definition zoom-c.c:89
void ZOOM_connection_show_task(ZOOM_task task)
Definition zoom-c.c:129
int ZOOM_test_reconnect(ZOOM_connection c)
Definition zoom-c.c:906
void ZOOM_set_error(ZOOM_connection c, int error, const char *addinfo)
Definition zoom-c.c:98
void ZOOM_connection_show_tasks(ZOOM_connection c)
Definition zoom-c.c:145
static void odr_wrbuf_write(ODR o, void *handle, int type, const char *buf, int len)
Definition zoom-c.c:229
static zoom_ret do_connect(ZOOM_connection c)
Definition zoom-c.c:1071
void ZOOM_connection_remove_task(ZOOM_connection c)
Definition zoom-c.c:183
static void ZOOM_scanset_term_x(ZOOM_scanset scan, size_t pos, size_t *occ, const char **value_term, size_t *value_len, const char **disp_term, size_t *disp_len)
Definition zoom-c.c:1287
static void initlog(void)
Definition zoom-c.c:40
static zoom_ret do_connect_host(ZOOM_connection c, const char *logical_url)
Definition zoom-c.c:1076
ZOOM_task ZOOM_connection_add_task(ZOOM_connection c, int which)
Definition zoom-c.c:153
int resultsets_count(void)
Definition zoom-c.c:680
static int resultset_use(int delta)
Definition zoom-c.c:669
ZOOM_resultset ZOOM_resultset_create(void)
Definition zoom-c.c:684
void ZOOM_set_HTTP_error(ZOOM_connection c, int error, const char *addinfo, const char *addinfo2)
Definition zoom-c.c:1558
static int log_api0
Definition zoom-c.c:34
void ZOOM_resultset_addref(ZOOM_resultset r)
Definition zoom-c.c:651
static void ZOOM_resultset_retrieve(ZOOM_resultset r, int force_sync, int start, int count)
Definition zoom-c.c:923
void ZOOM_connection_remove_tasks(ZOOM_connection c)
Definition zoom-c.c:223
static int log_details0
Definition zoom-c.c:35
static zoom_ret do_write_ex(ZOOM_connection c, char *buf_out, int len_out)
Definition zoom-c.c:1739
void ZOOM_set_dset_error(ZOOM_connection c, int error, const char *dset, const char *addinfo, const char *addinfo2)
Definition zoom-c.c:54
static YAZ_MUTEX g_resultset_mutex
Definition zoom-c.c:664
ZOOM_Event ZOOM_Event_create(int kind)
Definition zoom-event.c:42
ZOOM_Event ZOOM_connection_get_event(ZOOM_connection c)
Definition zoom-event.c:52
void ZOOM_connection_put_event(ZOOM_connection c, ZOOM_Event event)
Definition zoom-event.c:73
void ZOOM_Event_destroy(ZOOM_Event event)
Definition zoom-event.c:90
void ZOOM_connection_remove_events(ZOOM_connection c)
Definition zoom-event.c:95
void ZOOM_memcached_destroy(ZOOM_connection c)
int ZOOM_memcached_configure(ZOOM_connection c)
void ZOOM_memcached_resultset(ZOOM_resultset r, ZOOM_query q)
void ZOOM_memcached_init(ZOOM_connection c)
Internal header for ZOOM implementation.
struct ZOOM_Event_p * ZOOM_Event
Definition zoom-p.h:48
struct ZOOM_task_p * ZOOM_task
Definition zoom-p.h:59
#define STATE_CONNECTING
Definition zoom-p.h:62
Z_SortKeySpecList * ZOOM_query_get_sortspec(ZOOM_query s)
Definition zoom-query.c:135
int ZOOM_handle_sru(ZOOM_connection c, Z_HTTP_Response *hres, zoom_ret *cret, char **addinfo)
Definition zoom-sru.c:417
zoom_sru_mode
Definition zoom-p.h:50
@ zoom_sru_get
Definition zoom-p.h:53
@ zoom_sru_soap
Definition zoom-p.h:52
@ zoom_sru_error
Definition zoom-p.h:51
@ zoom_sru_post
Definition zoom-p.h:54
@ zoom_sru_solr
Definition zoom-p.h:55
zoom_ret ZOOM_connection_srw_send_search(ZOOM_connection c)
Definition zoom-sru.c:145
void ZOOM_handle_Z3950_apdu(ZOOM_connection c, Z_APDU *apdu)
zoom_ret ZOOM_connection_Z3950_send_scan(ZOOM_connection c)
Definition zoom-z3950.c:819
#define ZOOM_TASK_SCAN
Definition zoom-p.h:208
zoom_ret send_Z3950_sort(ZOOM_connection c, ZOOM_resultset resultset)
#define ZOOM_TASK_PACKAGE
Definition zoom-p.h:212
zoom_ret ZOOM_connection_Z3950_send_init(ZOOM_connection c)
Definition zoom-z3950.c:570
#define ZOOM_TASK_CONNECT
Definition zoom-p.h:207
#define STATE_IDLE
Definition zoom-p.h:61
#define RECORD_HASH_SIZE
Definition zoom-p.h:132
#define ZOOM_TASK_SORT
Definition zoom-p.h:214
zoom_ret ZOOM_connection_srw_send_scan(ZOOM_connection c)
Definition zoom-sru.c:92
zoom_ret
Definition zoom-p.h:223
@ zoom_pending
Definition zoom-p.h:224
@ zoom_complete
Definition zoom-p.h:225
#define ZOOM_TASK_SEARCH
Definition zoom-p.h:198
zoom_ret ZOOM_connection_Z3950_search(ZOOM_connection c)
ZOOM_record ZOOM_record_cache_lookup_i(ZOOM_resultset r, int pos, const char *syntax, const char *elementSetName, const char *schema)
#define STATE_ESTABLISHED
Definition zoom-p.h:63
Z_Query * ZOOM_query_get_Z_Query(ZOOM_query s)
Definition zoom-query.c:130
ZOOM_query_destroy(ZOOM_query s)
Definition zoom-query.c:231
ZOOM_resultset_sort1(ZOOM_resultset r, const char *sort_type, const char *sort_spec)
Definition zoom-c.c:817
#define ZOOM_ERROR_NONE
Definition zoom.h:127
#define ZOOM_SELECT_READ
select/poll socket mask: read
Definition zoom.h:415
#define ZOOM_ERROR_UNSUPPORTED_QUERY
Definition zoom.h:137
ZOOM_connection_search(ZOOM_connection, ZOOM_query q)
Definition zoom-c.c:737
ZOOM_event(int no, ZOOM_connection *cs)
wait for events on connection(s) (BLOCKING)
Definition zoom-socket.c:99
ZOOM_package_option_getl(ZOOM_package p, const char *key, int *lenp)
Definition zoom-c.c:1427
ZOOM_package_option_get(ZOOM_package p, const char *key)
Definition zoom-c.c:1421
ZOOM_scanset_term(ZOOM_scanset scan, size_t pos, size_t *occ, size_t *len)
Definition zoom-c.c:1345
#define ZOOM_ERROR_MEMORY
Definition zoom.h:129
ZOOM_connection_search_pqf(ZOOM_connection c, const char *q)
Definition zoom-c.c:724
ZOOM_connection_destroy(ZOOM_connection c)
Definition zoom-c.c:607
ZOOM_facet_field_get_term(ZOOM_facet_field facet_field, size_t idx, int *freq)
Definition zoom-c.c:1048
#define ZOOM_EVENT_END
Definition zoom.h:161
ZOOM_connection_get_timeout(ZOOM_connection c)
get timeout in seconds for ZOOM connection
ZOOM_resultset_cache_reset(ZOOM_resultset r)
ZOOM_resultset_option_set(ZOOM_resultset r, const char *key, const char *val)
Definition zoom-c.c:1857
#define ZOOM_ERROR_CQL_PARSE
Definition zoom.h:139
ZOOM_query_prefix(ZOOM_query s, const char *str)
Definition zoom-query.c:256
#define ZOOM_EVENT_RECV_APDU
Definition zoom.h:158
ZOOM_connection_error_x(ZOOM_connection c, const char **cp, const char **addinfo, const char **diagset)
Definition zoom-c.c:1945
ZOOM_options_destroy(ZOOM_options opt)
Definition zoom-opt.c:135
#define ZOOM_ERROR_ES_INVALID_SYNTAX
Definition zoom.h:145
ZOOM_resultset_facets_size(ZOOM_resultset r)
Definition zoom-c.c:996
ZOOM_connection_last_event(ZOOM_connection cs)
Definition zoom-c.c:2054
ZOOM_scanset_size(ZOOM_scanset scan)
Definition zoom-c.c:1275
#define ZOOM_ERROR_CCL_CONFIG
Definition zoom.h:141
#define ZOOM_ERROR_MEMCACHED
Definition zoom.h:146
ZOOM_resultset_size(ZOOM_resultset r)
Definition zoom-c.c:901
ZOOM_resultset_facets_names(ZOOM_resultset r)
Definition zoom-c.c:1030
#define ZOOM_ERROR_CQL_TRANSFORM
Definition zoom.h:140
struct ZOOM_scanset_p * ZOOM_scanset
Definition zoom.h:56
#define ZOOM_SELECT_EXCEPT
select/poll socket mask: except
Definition zoom.h:419
#define ZOOM_ERROR_ES_INVALID_ACTION
Definition zoom.h:143
ZOOM_connection_error(ZOOM_connection c, const char **cp, const char **addinfo)
Definition zoom-c.c:1970
ZOOM_options_getl(ZOOM_options opt, const char *name, int *lenp)
Definition zoom-opt.c:187
ZOOM_connection_option_setl(ZOOM_connection c, const char *key, const char *val, int len)
Definition zoom-c.c:1844
ZOOM_package_option_setl(ZOOM_package p, const char *key, const char *val, int len)
Definition zoom-c.c:1440
#define ZOOM_EVENT_RECV_DATA
Definition zoom.h:154
ZOOM_connection_scan1(ZOOM_connection c, ZOOM_query startterm)
Definition zoom-c.c:1203
struct ZOOM_facet_field_p * ZOOM_facet_field
Definition zoom.h:55
ZOOM_options_create_with_parent(ZOOM_options parent)
Definition zoom-opt.c:82
#define ZOOM_ERROR_CONNECT
Definition zoom.h:128
struct ZOOM_package_p * ZOOM_package
Definition zoom.h:57
ZOOM_resultset_sort(ZOOM_resultset r, const char *sort_type, const char *sort_spec)
Definition zoom-c.c:810
struct ZOOM_record_p * ZOOM_record
Definition zoom.h:54
ZOOM_scanset_option_set(ZOOM_scanset scan, const char *key, const char *val)
Definition zoom-c.c:1383
ZOOM_scanset_display_term(ZOOM_scanset scan, size_t pos, size_t *occ, size_t *len)
Definition zoom-c.c:1361
typedefZOOM_BEGIN_CDECL struct ZOOM_options_p * ZOOM_options
Definition zoom.h:50
ZOOM_connection_set_mask(ZOOM_connection c, int mask)
set socket mask for connection (DO NOT call outside zoom)
ZOOM_connection_option_get(ZOOM_connection c, const char *key)
Definition zoom-c.c:1789
ZOOM_resultset_records(ZOOM_resultset r, ZOOM_record *recs, size_t start, size_t count)
Definition zoom-c.c:975
ZOOM_options_get_int(ZOOM_options opt, const char *name, int defa)
Definition zoom-opt.c:236
ZOOM_options_create_with_parent2(ZOOM_options parent1, ZOOM_options parent2)
Definition zoom-opt.c:95
ZOOM_options_set(ZOOM_options opt, const char *name, const char *v)
Definition zoom-opt.c:181
ZOOM_connection_errmsg(ZOOM_connection c)
Definition zoom-c.c:1871
ZOOM_query_create(void)
Definition zoom-query.c:214
ZOOM_connection_create(ZOOM_options options)
Definition zoom-c.c:237
#define ZOOM_ERROR_CCL_PARSE
Definition zoom.h:142
ZOOM_package_option_set(ZOOM_package p, const char *key, const char *val)
Definition zoom-c.c:1433
#define ZOOM_ERROR_INTERNAL
Definition zoom.h:134
ZOOM_resultset_option_get(ZOOM_resultset r, const char *key)
Definition zoom-c.c:1851
ZOOM_facet_field_name(ZOOM_facet_field facet_field)
Definition zoom-c.c:1036
ZOOM_connection_process(ZOOM_connection c)
process one event for connection
Definition zoom-c.c:2076
ZOOM_connection_connect(ZOOM_connection c, const char *host, int portnum)
Definition zoom-c.c:362
ZOOM_resultset_release(ZOOM_resultset r)
ZOOM_connection_get_mask(ZOOM_connection c)
get socket mask for connection
ZOOM_resultset_facets(ZOOM_resultset r)
Definition zoom-c.c:1024
ZOOM_resultset_destroy(ZOOM_resultset r)
Definition zoom-c.c:865
ZOOM_resultset_get_facet_field(ZOOM_resultset r, const char *facet_name)
Definition zoom-c.c:1002
ZOOM_resultset_record_immediate(ZOOM_resultset s, size_t pos)
Definition zoom-c.c:1155
#define ZOOM_ERROR_ES_INVALID_VERSION
Definition zoom.h:144
struct ZOOM_query_p * ZOOM_query
Definition zoom.h:51
ZOOM_event_nonblock(int no, ZOOM_connection *cs)
process one event for one of connections given
Definition zoom-c.c:2099
ZOOM_connection_option_getl(ZOOM_connection c, const char *key, int *lenp)
Definition zoom-c.c:1800
ZOOM_resultset_record(ZOOM_resultset s, size_t pos)
Definition zoom-c.c:1168
#define ZOOM_EVENT_SEND_DATA
Definition zoom.h:153
#define ZOOM_ERROR_CONNECTION_LOST
Definition zoom.h:132
ZOOM_options_setl(ZOOM_options opt, const char *name, const char *value, int len)
Definition zoom-opt.c:161
ZOOM_diag_str(int error)
Definition zoom-c.c:1895
ZOOM_connection_option_set(ZOOM_connection c, const char *key, const char *val)
Definition zoom-c.c:1820
ZOOM_connection_addinfo(ZOOM_connection c)
Definition zoom-c.c:1879
ZOOM_scanset_option_get(ZOOM_scanset scan, const char *key)
Definition zoom-c.c:1377
#define ZOOM_EVENT_CONNECT
Definition zoom.h:152
#define ZOOM_ERROR_DECODE
Definition zoom.h:131
#define ZOOM_ERROR_INVALID_QUERY
Definition zoom.h:138
#define ZOOM_ERROR_UNSUPPORTED_PROTOCOL
Definition zoom.h:136
ZOOM_connection_diagset(ZOOM_connection c)
Definition zoom-c.c:1887
struct ZOOM_connection_p * ZOOM_connection
Definition zoom.h:52
ZOOM_connection_close(ZOOM_connection c)
ZOOM_package_destroy(ZOOM_package p)
Definition zoom-c.c:1405
ZOOM_connection_new(const char *host, int portnum)
Definition zoom-c.c:338
ZOOM_connection_is_idle(ZOOM_connection c)
determines if connection is idle (no active or pending work)
#define ZOOM_EVENT_SEND_APDU
Definition zoom.h:157
ZOOM_connection_package(ZOOM_connection c, ZOOM_options options)
Definition zoom-c.c:1391
ZOOM_options_get(ZOOM_options opt, const char *name)
Definition zoom-opt.c:217
ZOOM_connection_errcode(ZOOM_connection c)
Definition zoom-c.c:1865
ZOOM_connection_get_socket(ZOOM_connection c)
get socket fd for ZOOM connection
ZOOM_connection_fire_event_socket(ZOOM_connection c, int mask)
fire socket event activity (read,write,except)
#define ZOOM_ERROR_TIMEOUT
Definition zoom.h:135
#define ZOOM_EVENT_TIMEOUT
Definition zoom.h:155
ZOOM_connection_fire_event_timeout(ZOOM_connection c)
fire socket event timeout
#define ZOOM_EVENT_NONE
Definition zoom.h:151
#define ZOOM_API(x)
Definition zoom.h:42
ZOOM_query_addref(ZOOM_query s)
Definition zoom-query.c:249
ZOOM_resultset_get_facet_field_by_index(ZOOM_resultset r, int pos)
Definition zoom-c.c:1014
ZOOM_scanset_destroy(ZOOM_scanset scan)
Definition zoom-c.c:1240
ZOOM_options_get_bool(ZOOM_options opt, const char *name, int defa)
Definition zoom-opt.c:224
#define ZOOM_ERROR_INIT
Definition zoom.h:133
ZOOM_query_sortby(ZOOM_query s, const char *criteria)
Definition zoom-query.c:337
ZOOM_connection_exec_task(ZOOM_connection c)
executes non-blocking tasks for connection
Definition zoom-c.c:1447
ZOOM_facet_field_term_count(ZOOM_facet_field facet_field)
Definition zoom-c.c:1042
#define ZOOM_SELECT_WRITE
select/poll socket mask: write
Definition zoom.h:417
#define ZOOM_ERROR_ENCODE
Definition zoom.h:130
struct ZOOM_resultset_p * ZOOM_resultset
Definition zoom.h:53
ZOOM_connection_scan(ZOOM_connection c, const char *startterm)
Definition zoom-c.c:1189