YAZ 5.37.0
ztest.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 */
8#if HAVE_CONFIG_H
9#include <config.h>
10#endif
11
12
13#include <stdio.h>
14#include <math.h>
15#include <stdlib.h>
16
17#if HAVE_SYS_TIME_H
18#include <sys/time.h>
19#endif
20#if HAVE_UNISTD_H
21#include <unistd.h>
22#endif
23#if HAVE_SYS_SELECT_H
24#include <sys/select.h>
25#endif
26#ifdef WIN32
27#include <windows.h>
28#endif
29
30#include <yaz/log.h>
31#include <yaz/backend.h>
32#include <yaz/ill.h>
33#include <yaz/diagbib1.h>
34#include <yaz/otherinfo.h>
35#include <yaz/facet.h>
36#include <yaz/backtrace.h>
37#include <yaz/snprintf.h>
38
39#include "ztest.h"
40
41static int log_level=0;
42static int log_level_set=0;
43
44struct delay {
45 double d1;
46 double d2;
47};
48
58
62
63int ztest_search(void *handle, bend_search_rr *rr);
64int ztest_sort(void *handle, bend_sort_rr *rr);
65int ztest_present(void *handle, bend_present_rr *rr);
66int ztest_esrequest(void *handle, bend_esrequest_rr *rr);
67int ztest_delete(void *handle, bend_delete_rr *rr);
68
69static struct result_set *get_set(struct session_handle *sh, const char *name)
70{
71 struct result_set *set = sh->result_sets;
72 for (; set; set = set->next)
73 if (!strcmp(name, set->name))
74 return set;
75 return 0;
76}
77
78static void remove_sets(struct session_handle *sh)
79{
80 struct result_set *set = sh->result_sets;
81 while (set)
82 {
83 struct result_set *set_next = set->next;
84 xfree(set->name);
85 xfree(set->db);
86 xfree(set);
87 set = set_next;
88 }
89 sh->result_sets = 0;
90}
91
101static Odr_int get_term_hit(Z_RPNStructure *s, unsigned *hash)
102{
103 Odr_int h = -1;
104 switch(s->which)
105 {
107 if (s->u.simple->which == Z_Operand_APT)
108 {
110 if (apt->term->which == Z_Term_general)
111 {
112 Odr_oct *oct = apt->term->u.general;
113 if (oct->len > 0 && oct->buf[0] >= '0' && oct->buf[0] <= '9')
114 {
115 WRBUF hits_str = wrbuf_alloc();
116 wrbuf_write(hits_str, (const char *) oct->buf, oct->len);
117 h = odr_atoi(wrbuf_cstr(hits_str));
118 wrbuf_destroy(hits_str);
119 }
120 else
121 {
122 int i;
123 for (i = 0; i < oct->len; i++)
124 *hash = *hash * 65509 + oct->buf[i];
125 }
126 }
127 }
128 break;
130 h = get_term_hit(s->u.complex->s1, hash);
131 if (h == -1)
132 h = get_term_hit(s->u.complex->s2, hash);
133 break;
134 }
135 return h;
136}
137
148{
149 if (q->which == Z_Query_type_1 || q->which == Z_Query_type_101)
150 {
151 unsigned hash = 0;
152 Odr_int h = -1;
153 h = get_term_hit(q->u.type_1->RPNStructure, &hash);
154 if (h == -1)
155 h = hash % 24;
156 return h;
157 }
158 else if (q->which == Z_Query_type_104 &&
160 {
161 unsigned hash = 0;
162 const char *cql = q->u.type_104->u.cql;
163 int i;
164 for (i = 0; cql[i]; i++)
165 hash = hash * 65509 + cql[i];
166 return hash % 24;
167 }
168 else
169 return 24;
170}
171
181static int check_slow(const char *basename, bend_association association)
182{
183 if (strncmp(basename, "Slow", 4) == 0)
184 {
185#if HAVE_UNISTD_H
186 int i, w = 3;
187 if (basename[4])
188 sscanf(basename+4, "%d", &w);
189 /* wait up to 3 seconds and check if connection is still alive */
190 for (i = 0; i < w; i++)
191 {
193 {
194 yaz_log(YLOG_LOG, "search aborted");
195 break;
196 }
197 sleep(1);
198 }
199#endif
200 return 1;
201 }
202 return 0;
203}
204
205static int strcmp_prefix(const char *s, const char *p)
206{
207 size_t l = strlen(p);
208 if (strlen(s) >= l && !memcmp(s, p, l))
209 return 1;
210 return 0;
211}
212
213static void init_delay(struct delay *delayp)
214{
215 delayp->d1 = delayp->d2 = 0.0;
216}
217
218static int parse_delay(struct delay *delayp, const char *value)
219{
220 if (sscanf(value, "%lf:%lf", &delayp->d1, &delayp->d2) == 2)
221 ;
222 else if (sscanf(value, "%lf", &delayp->d1) == 1)
223 delayp->d2 = 0.0;
224 else
225 return -1;
226 return 0;
227}
228
229static void ztest_sleep(double d)
230{
231#ifdef WIN32
232 Sleep( (DWORD) (d * 1000));
233#else
234 struct timeval tv;
235 tv.tv_sec = d;
236 tv.tv_usec = (d - (long) d) * 1000000;
237 select(0, 0, 0, 0, &tv);
238#endif
239}
240
241static void do_delay(const struct delay *delayp)
242{
243 double d = delayp->d1;
244
245 if (d > 0.0)
246 {
247 if (delayp->d2 > d)
248 d += (rand()) * (delayp->d2 - d) / RAND_MAX;
249 ztest_sleep(d);
250 }
251}
252
253static void addterms(ODR odr, Z_FacetField *facet_field, const char *facet_name)
254{
255 int index;
256 int freq = 100;
257 int length = strlen(facet_name) + 10;
258 char *key = odr_malloc(odr, length);
259 key[0] = '\0';
260 for (index = 0; index < facet_field->num_terms; index++)
261 {
262 Z_FacetTerm *facet_term;
263 yaz_snprintf(key, length, "%s%d", facet_name, index);
264 yaz_log(YLOG_DEBUG, "facet add term %s %d %s", facet_name, index, key);
265
266 facet_term = facet_term_create_cstr(odr, key, freq);
267 freq = freq - 10 ;
268 facet_field_term_set(odr, facet_field, facet_term, index);
269 }
270}
271
273 int index, new_index = 0;
274 Z_FacetList *new_list = facet_list_create(odr, facet_list->num);
275
276 for (index = 0; index < facet_list->num; index++) {
277 struct yaz_facet_attr attrvalues;
278 yaz_facet_attr_init(&attrvalues);
279 attrvalues.limit = 10;
281 &attrvalues);
282 yaz_log(YLOG_LOG, "Attributes: %s limit=%d start=%d sort=%d",
283 attrvalues.useattr ? attrvalues.useattr : "NONE",
284 attrvalues.limit,
285 attrvalues.start,
286 attrvalues.sortorder);
287 if (attrvalues.errstring)
288 yaz_log(YLOG_LOG, "Error parsing attributes: %s", attrvalues.errstring);
289 if (attrvalues.limit > 0 && attrvalues.useattr) {
290 new_list->elements[new_index] = facet_field_create(odr, facet_list->elements[index]->attributes, attrvalues.limit);
291 addterms(odr, new_list->elements[new_index], attrvalues.useattr);
292 new_index++;
293 }
294 else {
295 yaz_log(YLOG_DEBUG, "Facet: skipping %s due to 0 limit.", attrvalues.useattr);
296 }
297
298 }
299 new_list->num = new_index;
300 if (new_index > 0) {
301 Z_OtherInformation *oi = odr_malloc(odr, sizeof(*oi));
302 Z_OtherInformationUnit *oiu = odr_malloc(odr, sizeof(*oiu));
303 oi->num_elements = 1;
304 oi->list = odr_malloc(odr, oi->num_elements * sizeof(*oi->list));
305 oiu->category = 0;
313 oi->list[0] = oiu;
314 return oi;
315 }
316 return 0;
317}
318
319static void echo_extra_args(ODR stream,
320 Z_SRW_extra_arg *extra_args, char **extra_response)
321{
322 if (extra_args)
323 {
325 WRBUF response_xml = wrbuf_alloc();
326 wrbuf_puts(response_xml, "<extra>");
327 for (a = extra_args; a; a = a->next)
328 {
329 wrbuf_puts(response_xml, "<extra name=\"");
330 wrbuf_xmlputs(response_xml, a->name);
331 wrbuf_puts(response_xml, "\"");
332 if (a->value)
333 {
334 wrbuf_puts(response_xml, " value=\"");
335 wrbuf_xmlputs(response_xml, a->value);
336 wrbuf_puts(response_xml, "\"");
337 }
338 wrbuf_puts(response_xml, "/>");
339 }
340 wrbuf_puts(response_xml, "</extra>");
341 *extra_response = odr_strdup(stream, wrbuf_cstr(response_xml));
342 wrbuf_destroy(response_xml);
343 }
344
345}
346
347int ztest_search(void *handle, bend_search_rr *rr)
348{
349 struct session_handle *sh = (struct session_handle*) handle;
350 struct result_set *new_set;
351 const char *db, *db_sep;
352
353 if (rr->num_bases != 1)
354 {
356 return 0;
357 }
358
359 db = rr->basenames[0];
360
361 /* Allow Default, db.* and Slow */
362 if (strcmp_prefix(db, "Default"))
363 ; /* Default is OK in our test */
364 else if (strcmp_prefix(db, "db"))
365 ; /* db.* is OK in our test */
366 else if (check_slow(rr->basenames[0], rr->association))
367 {
368 rr->estimated_hit_count = 1;
369 }
370 else
371 {
373 rr->errstring = rr->basenames[0];
374 return 0;
375 }
376
377 new_set = get_set(sh, rr->setname);
378 if (new_set)
379 {
380 if (!rr->replace_set)
381 {
383 return 0;
384 }
385 xfree(new_set->db);
386 }
387 else
388 {
389 new_set = xmalloc(sizeof(*new_set));
390 new_set->next = sh->result_sets;
391 sh->result_sets = new_set;
392 new_set->name = xstrdup(rr->setname);
393 }
394 new_set->hits = 0;
395 new_set->db = xstrdup(db);
396 init_delay(&new_set->search_delay);
397 init_delay(&new_set->present_delay);
398 init_delay(&new_set->fetch_delay);
399
400 db_sep = strchr(db, '?');
401 if (db_sep)
402 {
403 char **names;
404 char **values;
405 int no_parms = yaz_uri_to_array(db_sep+1, rr->stream, &names, &values);
406 int i;
407 for (i = 0; i < no_parms; i++)
408 {
409 const char *name = names[i];
410 const char *value = values[i];
411 if (!strcmp(name, "seed"))
412 srand(atoi(value));
413 else if (!strcmp(name, "search-delay"))
414 parse_delay(&new_set->search_delay, value);
415 else if (!strcmp(name, "present-delay"))
416 parse_delay(&new_set->present_delay, value);
417 else if (!strcmp(name, "fetch-delay"))
418 parse_delay(&new_set->fetch_delay, value);
419 else
420 {
422 rr->errstring = odr_strdup(rr->stream, name);
423 }
424 }
425 }
426
428 rr->hits = get_hit_count(rr->query);
429
430 if (1)
431 {
433 if (facet_list) {
434 yaz_log(YLOG_LOG, "%d Facets in search request.", facet_list->num);
435 rr->search_info = build_facet_response(rr->stream, facet_list);
436 }
437 else
438 yaz_log(YLOG_DEBUG, "No facets parsed search request.");
439
440 }
441 do_delay(&new_set->search_delay);
442 new_set->hits = rr->hits;
443
444 return 0;
445}
446
447
448/* this huge function handles extended services */
449int ztest_esrequest(void *handle, bend_esrequest_rr *rr)
450{
451 if (rr->esr->packageName)
452 yaz_log(log_level, "packagename: %s", rr->esr->packageName);
453 yaz_log(log_level, "Waitaction: " ODR_INT_PRINTF, *rr->esr->waitAction);
454
455
456 yaz_log(log_level, "function: " ODR_INT_PRINTF, *rr->esr->function);
457
458 if (!rr->esr->taskSpecificParameters)
459 {
460 yaz_log(log_level, "No task specific parameters");
461 }
463 {
465 yaz_log(log_level, "Received ItemOrder");
467 {
468 Z_IORequest *ir = it->u.esRequest;
471 const char *xml_in_response = 0;
472
473 if (k && k->contact)
474 {
475 if (k->contact->name)
476 yaz_log(log_level, "contact name %s", k->contact->name);
477 if (k->contact->phone)
478 yaz_log(log_level, "contact phone %s", k->contact->phone);
479 if (k->contact->email)
480 yaz_log(log_level, "contact email %s", k->contact->email);
481 }
482 if (k->addlBilling)
483 {
484 yaz_log(log_level, "Billing info (not shown)");
485 }
486
487 if (n->resultSetItem)
488 {
489 yaz_log(log_level, "resultsetItem");
490 yaz_log(log_level, "setId: %s", n->resultSetItem->resultSetId);
492 }
493 if (n->itemRequest)
494 {
496 ILL_ItemRequest *item_req = 0;
497 ILL_APDU *ill_apdu = 0;
498 if (r->direct_reference)
499 {
500 char oid_name_str[OID_STR_MAX];
501 oid_class oclass;
502 const char *oid_name =
504 &oclass, oid_name_str);
505 if (oid_name)
506 yaz_log(log_level, "OID %s", oid_name);
508 {
509 yaz_log(log_level, "ILL XML request");
510 if (r->which == Z_External_octet)
511 yaz_log(log_level, "%.*s",
512 r->u.octet_aligned->len,
513 r->u.octet_aligned->buf);
514 xml_in_response = "<dummy>x</dummy>";
515 }
518 {
519 yaz_log(log_level, "Decode ItemRequest begin");
520 if (r->which == ODR_EXTERNAL_single)
521 {
522 odr_setbuf(rr->decode,
523 (char *) r->u.single_ASN1_type->buf,
524 r->u.single_ASN1_type->len, 0);
525
526 if (!ill_ItemRequest(rr->decode, &item_req, 0, 0))
527 {
529 "Couldn't decode ItemRequest %s near %ld",
531 (long) odr_offset(rr->decode));
532 }
533 else
534 yaz_log(log_level, "Decode ItemRequest OK");
535 if (rr->print)
536 {
537 ill_ItemRequest(rr->print, &item_req, 0,
538 "ItemRequest");
539 odr_reset(rr->print);
540 }
541 }
542 if (!item_req && r->which == ODR_EXTERNAL_single)
543 {
544 yaz_log(log_level, "Decode ILL APDU begin");
545 odr_setbuf(rr->decode,
546 (char*) r->u.single_ASN1_type->buf,
547 r->u.single_ASN1_type->len, 0);
548
549 if (!ill_APDU(rr->decode, &ill_apdu, 0, 0))
550 {
552 "Couldn't decode ILL APDU %s near %ld",
554 (long) odr_offset(rr->decode));
555 yaz_log(log_level, "PDU dump:");
557 (char *) r->u.single_ASN1_type->buf,
559 }
560 else
561 yaz_log(log_level, "Decode ILL APDU OK");
562 if (rr->print)
563 {
564 ill_APDU(rr->print, &ill_apdu, 0,
565 "ILL APDU");
566 odr_reset(rr->print);
567 }
568 }
569 }
570 }
571 if (item_req)
572 {
573 yaz_log(log_level, "ILL protocol version = "
575 *item_req->protocol_version_num);
576 }
577 }
578 if (k)
579 {
580
581 Z_External *ext = (Z_External *)
582 odr_malloc(rr->stream, sizeof(*ext));
584 odr_malloc(rr->stream, sizeof(*keep));
585 Z_IOTargetPart *targetPart = (Z_IOTargetPart *)
586 odr_malloc(rr->stream, sizeof(*targetPart));
587
588 rr->taskPackage = (Z_TaskPackage *)
589 odr_malloc(rr->stream, sizeof(*rr->taskPackage));
591 odr_oiddup(rr->stream, rr->esr->packageType);
592 rr->taskPackage->packageName = 0;
593 rr->taskPackage->userId = 0;
594 rr->taskPackage->retentionTime = 0;
595 rr->taskPackage->permissions = 0;
596 rr->taskPackage->description = 0;
598 odr_create_Odr_oct(rr->stream, "911", 3);
603
604 ext->direct_reference =
605 odr_oiddup(rr->stream, rr->esr->packageType);
606 ext->indirect_reference = 0;
607 ext->descriptor = 0;
609 ext->u.itemOrder = (Z_ItemOrder *)
610 odr_malloc(rr->stream, sizeof(*ext->u.update));
613 odr_malloc(rr->stream, sizeof(Z_IOTaskPackage));
615 ext->u.itemOrder->u.taskPackage->targetPart = targetPart;
616
617 if (xml_in_response)
618 targetPart->itemRequest =
619 z_ext_record_xml(rr->stream, xml_in_response,
620 strlen(xml_in_response));
621 else
622 targetPart->itemRequest = 0;
623
624 targetPart->statusOrErrorReport = 0;
625 targetPart->auxiliaryStatus = 0;
626 }
627 }
628 }
630 {
632 yaz_log(log_level, "Received DB Update0");
633 Z_IU0UpdateEsRequest *esRequest = up->u.esRequest;
634 Z_IU0OriginPartToKeep *toKeep = esRequest->toKeep;
635 if (toKeep->action)
636 {
637 yaz_log(log_level, "action " ODR_INT_PRINTF, *toKeep->action);
638 }
639 rr->errcode = -2;
640 rr->errstring= "xxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyy";
641 }
643 {
645 yaz_log(log_level, "Received DB Update");
646 if (up->which == Z_IUUpdate_esRequest)
647 {
648 Z_IUUpdateEsRequest *esRequest = up->u.esRequest;
649 Z_IUOriginPartToKeep *toKeep = esRequest->toKeep;
650 Z_IUSuppliedRecords *notToKeep = esRequest->notToKeep;
651
652 yaz_log(log_level, "action");
653 if (toKeep->action)
654 {
655 switch (*toKeep->action)
656 {
658 yaz_log(log_level, " recordInsert");
659 break;
661 yaz_log(log_level, " recordReplace");
662 break;
664 yaz_log(log_level, " recordDelete");
665 break;
667 yaz_log(log_level, " elementUpdate");
668 break;
670 yaz_log(log_level, " specialUpdate");
671 break;
672 default:
673 yaz_log(log_level, " unknown (" ODR_INT_PRINTF ")",
674 *toKeep->action);
675 }
676 }
677 if (toKeep->databaseName)
678 {
679 yaz_log(log_level, "database: %s", toKeep->databaseName);
680 if (!strcmp(toKeep->databaseName, "fault"))
681 {
683 rr->errstring = toKeep->databaseName;
684 }
685 if (!strcmp(toKeep->databaseName, "accept"))
686 rr->errcode = -1;
687 }
688 if (toKeep)
689 {
690 Z_External *ext = (Z_External *)
691 odr_malloc(rr->stream, sizeof(*ext));
693 odr_malloc(rr->stream, sizeof(*keep));
694 Z_IUTargetPart *targetPart = (Z_IUTargetPart *)
695 odr_malloc(rr->stream, sizeof(*targetPart));
696
697 rr->taskPackage = (Z_TaskPackage *)
698 odr_malloc(rr->stream, sizeof(*rr->taskPackage));
700 odr_oiddup(rr->stream, rr->esr->packageType);
701 rr->taskPackage->packageName = 0;
702 rr->taskPackage->userId = 0;
703 rr->taskPackage->retentionTime = 0;
704 rr->taskPackage->permissions = 0;
705 rr->taskPackage->description = 0;
707 odr_create_Odr_oct(rr->stream, "123", 3);
712
713 ext->direct_reference =
714 odr_oiddup(rr->stream, rr->esr->packageType);
715 ext->indirect_reference = 0;
716 ext->descriptor = 0;
718 ext->u.update = (Z_IUUpdate *)
719 odr_malloc(rr->stream, sizeof(*ext->u.update));
723 ext->u.update->u.taskPackage->originPart = keep;
724 ext->u.update->u.taskPackage->targetPart = targetPart;
725
726 keep->action = odr_intdup(rr->stream, *toKeep->action);
727 keep->databaseName =
728 odr_strdup(rr->stream, toKeep->databaseName);
729 keep->schema = 0;
730 keep->elementSetName = 0;
731 keep->actionQualifier = 0;
732
733 targetPart->updateStatus = odr_intdup(rr->stream, 1);
734 targetPart->num_globalDiagnostics = 0;
735 targetPart->globalDiagnostics = (Z_DiagRec **) odr_nullval();
736 targetPart->num_taskPackageRecords = 1;
737 targetPart->taskPackageRecords =
739 odr_malloc(rr->stream,
741 targetPart->taskPackageRecords[0] =
743 odr_malloc(rr->stream,
745
746 targetPart->taskPackageRecords[0]->which =
748 targetPart->taskPackageRecords[0]->u.record =
749 z_ext_record_sutrs(rr->stream, "test", 4);
750 targetPart->taskPackageRecords[0]->correlationInfo = 0;
751 targetPart->taskPackageRecords[0]->recordStatus =
752 odr_intdup(rr->stream,
755 = 0;
756
758 }
759 if (notToKeep)
760 {
761 int i;
762 for (i = 0; i < notToKeep->num; i++)
763 {
764 Z_External *rec = notToKeep->elements[i]->record;
765
766 if (rec->direct_reference)
767 {
768 char oid_name_str[OID_STR_MAX];
769 const char *oid_name
770 = oid_name = yaz_oid_to_string_buf(
771 rec->direct_reference, 0,
772 oid_name_str);
773 if (oid_name)
774 yaz_log(log_level, "record %d type %s", i,
775 oid_name);
776 }
777 switch (rec->which)
778 {
779 case Z_External_sutrs:
780 if (rec->u.octet_aligned->len > 170)
781 yaz_log(log_level, "%d bytes:\n%.168s ...",
782 rec->u.sutrs->len,
783 rec->u.sutrs->buf);
784 else
785 yaz_log(log_level, "%d bytes:\n%s",
786 rec->u.sutrs->len,
787 rec->u.sutrs->buf);
788 break;
789 case Z_External_octet :
790 if (rec->u.octet_aligned->len > 170)
791 yaz_log(log_level, "%d bytes:\n%.168s ...",
792 rec->u.octet_aligned->len,
793 rec->u.octet_aligned->buf);
794 else
795 yaz_log(log_level, "%d bytes\n%s",
796 rec->u.octet_aligned->len,
797 rec->u.octet_aligned->buf);
798 }
799 }
800 }
801 }
802 }
803 return 0;
804}
805
806/* result set delete */
807int ztest_delete(void *handle, bend_delete_rr *rr)
808{
809 if (rr->num_setnames == 1 && !strcmp(rr->setnames[0], "1"))
811 else
813 return 0;
814}
815
816/* Our sort handler really doesn't sort... */
817int ztest_sort(void *handle, bend_sort_rr *rr)
818{
819 rr->errcode = 0;
821 return 0;
822}
823
824
825/* present request handler */
826int ztest_present(void *handle, bend_present_rr *rr)
827{
828 struct session_handle *sh = (struct session_handle*) handle;
829 struct result_set *set = get_set(sh, rr->setname);
830
831 if (!set)
832 {
834 rr->errstring = odr_strdup(rr->stream, rr->setname);
835 return 0;
836 }
837 do_delay(&set->present_delay);
838 return 0;
839}
840
841/* retrieval of a single record (present, and piggy back search) */
842int ztest_fetch(void *handle, bend_fetch_rr *r)
843{
844 struct session_handle *sh = (struct session_handle*) handle;
845 char *cp;
846 const Odr_oid *oid = r->request_format;
847 struct result_set *set = get_set(sh, r->setname);
848 const char *esn = yaz_get_esn(r->comp);
849
850 if (!set)
851 {
853 r->errstring = odr_strdup(r->stream, r->setname);
854 return 0;
855 }
856 do_delay(&set->fetch_delay);
857 r->last_in_set = 0;
858 r->basename = set->db;
860
861 if (r->number < 1 || r->number > set->hits)
862 {
864 return 0;
865 }
866 if (!oid || yaz_oid_is_iso2709(oid))
867 {
868 cp = dummy_marc_record(r->number, r->stream);
869 if (!cp)
870 {
872 r->surrogate_flag = 1;
873 return 0;
874 }
875 else
876 {
877 r->len = strlen(cp);
878 r->record = cp;
880 }
881 }
882 else if (!oid_oidcmp(oid, yaz_oid_recsyn_opac))
883 {
884 cp = dummy_marc_record(r->number, r->stream);
885 if (!cp)
886 {
888 r->surrogate_flag = 1;
889 return 0;
890 }
891 r->record = (char *) dummy_opac(r->number, r->stream, cp);
892 r->len = -1;
893 }
894 else if (!oid_oidcmp(oid, yaz_oid_recsyn_sutrs))
895 {
896 /* this section returns a small record */
897 char buf[100];
898
899 yaz_snprintf(buf, sizeof(buf), "This is dummy SUTRS record number %d\n", r->number);
900
901 r->len = strlen(buf);
902 r->record = (char *) odr_malloc(r->stream, r->len+1);
903 strcpy(r->record, buf);
904 }
905 else if (!oid_oidcmp(oid, yaz_oid_recsyn_grs_1))
906 {
907 r->len = -1;
908 r->record = (char*) dummy_grs_record(r->number, r->stream);
909 if (!r->record)
910 {
912 r->surrogate_flag = 1;
913 return 0;
914 }
915 }
917 {
918 char fname[20];
919 FILE *f;
920 long size;
921
922 yaz_snprintf(fname, sizeof(fname), "part.%d.ps", r->number);
923 f = fopen(fname, "rb");
924 if (!f)
925 {
927 r->surrogate_flag = 1;
928 return 0;
929 }
930 fseek(f, 0L, SEEK_END);
931 size = ftell(f);
932 if (size <= 0 || size >= 5000000)
933 {
935 r->surrogate_flag = 1;
936 }
937 fseek(f, 0L, SEEK_SET);
938 r->record = (char*) odr_malloc(r->stream, size);
939 r->len = size;
940 if (fread(r->record, size, 1, f) != 1)
941 {
943 r->surrogate_flag = 1;
944 }
945 fclose(f);
946 }
947 else if (!oid_oidcmp(oid, yaz_oid_recsyn_xml))
948 {
949 if ((cp = dummy_xml_record(r->number, r->stream, esn)))
950 {
951 r->len = strlen(cp);
952 r->record = cp;
953 r->schema = "info:srw/schema/1/marcxml-1.1";
954 }
955 else
956 {
958 r->surrogate_flag = 1;
959 return 0;
960 }
961 }
962 else if (!oid_oidcmp(oid, yaz_oid_recsyn_json))
963 {
964 if ((cp = dummy_json_record(r->number, r->stream, esn)))
965 {
966 r->len = strlen(cp);
967 r->record = cp;
968 r->schema = "info:srw/schema/1/marcxml-1.1";
969 }
970 else
971 {
973 r->surrogate_flag = 1;
974 return 0;
975 }
976 }
977 else
978 {
979 char buf[OID_STR_MAX];
982 return 0;
983 }
984 r->errcode = 0;
985 return 0;
986}
987
988/*
989 * silly dummy-scan what reads words from a file.
990 */
991int ztest_scan(void *handle, bend_scan_rr *q)
992{
993 static FILE *f = 0;
994 static struct scan_entry list[200];
995 static char entries[200][80];
996 int hits[200];
997 char term[80], *p;
998 int i, pos;
999 int term_position_req = q->term_position;
1000 int num_entries_req = q->num_entries;
1001
1002 /* Throw Database unavailable if other than Default or Slow */
1003 if (!yaz_matchstr(q->basenames[0], "Default"))
1004 ; /* Default is OK in our test */
1005 else if (check_slow(q->basenames[0], 0 /* no assoc for scan */))
1006 ;
1007 else
1008 {
1010 q->errstring = q->basenames[0];
1011 return 0;
1012 }
1013
1014 q->errcode = 0;
1015 q->errstring = 0;
1016 q->entries = list;
1018 if (!f && !(f = fopen("dummy-words", "r")))
1019 {
1020 perror("dummy-words");
1021 exit(1);
1022 }
1023 if (q->num_entries > 200)
1024 {
1026 return 0;
1027 }
1028 if (q->term)
1029 {
1030 int len;
1031 if (q->term->term->which != Z_Term_general)
1032 {
1034 return 0;
1035 }
1036 if (*q->step_size != 0)
1037 {
1039 return 0;
1040 }
1041 len = q->term->term->u.general->len;
1042 if (len >= (int ) sizeof(term))
1043 len = sizeof(term)-1;
1044 memcpy(term, q->term->term->u.general->buf, len);
1045 term[len] = '\0';
1046 }
1047 else if (q->scanClause)
1048 {
1049 strncpy(term, q->scanClause, sizeof(term)-1);
1050 term[sizeof(term)-1] = '\0';
1051 }
1052 else
1053 strcpy(term, "0");
1054
1055 for (p = term; *p; p++)
1056 if (yaz_islower(*p))
1057 *p = yaz_toupper(*p);
1058
1059 fseek(f, 0, SEEK_SET);
1060 q->num_entries = 0;
1061
1062 for (i = 0, pos = 0; fscanf(f, " %79[^:]:%d", entries[pos], &hits[pos]) == 2;
1063 i++, pos < 199 ? pos++ : (pos = 0))
1064 {
1065 if (!q->num_entries && strcmp(entries[pos], term) >= 0) /* s-point fnd */
1066 {
1067 if ((q->term_position = term_position_req) > i + 1)
1068 {
1069 q->term_position = i + 1;
1071 }
1072 for (; q->num_entries < q->term_position; q->num_entries++)
1073 {
1074 int po;
1075
1076 po = pos - q->term_position + q->num_entries+1; /* find pos */
1077 if (po < 0)
1078 po += 200;
1079
1080 if (!strcmp(term, "SD") && q->num_entries == 2)
1081 {
1082 list[q->num_entries].term = entries[pos];
1083 list[q->num_entries].occurrences = -1;
1084 list[q->num_entries].errcode =
1086 list[q->num_entries].errstring = "SD for Scan Term";
1087 }
1088 else
1089 {
1090 list[q->num_entries].term = entries[po];
1091 list[q->num_entries].occurrences = hits[po];
1092 }
1093 }
1094 }
1095 else if (q->num_entries)
1096 {
1097 list[q->num_entries].term = entries[pos];
1098 list[q->num_entries].occurrences = hits[pos];
1099 q->num_entries++;
1100 }
1101 if (q->num_entries >= num_entries_req)
1102 break;
1103 }
1105 if (feof(f))
1107 return 0;
1108}
1109
1110int ztest_explain(void *handle, bend_explain_rr *rr)
1111{
1112 if (rr->database && !strcmp(rr->database, "Default"))
1113 {
1114 rr->explain_buf = "<explain>\n"
1115 "\t<serverInfo>\n"
1116 "\t\t<host>localhost</host>\n"
1117 "\t\t<port>210</port>\n"
1118 "\t</serverInfo>\n"
1119 "</explain>\n";
1120 }
1121 return 0;
1122}
1123
1124int ztest_update(void *handle, bend_update_rr *rr)
1125{
1126 rr->operation_status = "success";
1127 return 0;
1128}
1129
1131{
1133 odr_malloc(q->stream, sizeof(*r));
1134 struct session_handle *sh = xmalloc(sizeof(*sh));
1135
1136 sh->result_sets = 0;
1137
1138 if (!log_level_set)
1139 {
1141 log_level_set=1;
1142 }
1143
1144 r->errcode = 0;
1145 r->errstring = 0;
1146 r->handle = sh; /* tell GFS about our handle */
1147 q->bend_sort = ztest_sort; /* register sort handler */
1148 q->bend_search = ztest_search; /* register search handler */
1149 q->bend_present = ztest_present; /* register present handle */
1153 q->bend_scan = ztest_scan;
1154#if 0
1156#endif
1159
1160 q->query_charset = "ISO-8859-1";
1162 q->named_result_sets = 1;
1163
1164 return r;
1165}
1166
1167void bend_close(void *handle)
1168{
1169 struct session_handle *sh = (struct session_handle*) handle;
1170 remove_sets(sh);
1171 xfree(sh); /* release our session */
1172 return;
1173}
1174
1175int main(int argc, char **argv)
1176{
1178
1179 return statserv_main(argc, argv, bend_init, bend_close);
1180}
1181/*
1182 * Local variables:
1183 * c-basic-offset: 4
1184 * c-file-style: "Stroustrup"
1185 * indent-tabs-mode: nil
1186 * End:
1187 * vim: shiftwidth=4 tabstop=8 expandtab
1188 */
1189
Header for GFS.
struct association * bend_association
Definition backend.h:46
@ BEND_SCAN_SUCCESS
Definition backend.h:128
@ BEND_SCAN_PARTIAL
Definition backend.h:129
void yaz_enable_panic_backtrace(const char *progname)
enables backtrace when SIGSEGV/SIGABRT/.. signal is received
Definition backtrace.c:217
backtrace handling
Diagnostics: Generated by csvtodiag.tcl from ./bib1.csv.
#define YAZ_BIB1_DATABASE_UNAVAILABLE
Definition diagbib1.h:53
#define YAZ_BIB1_RESOURCES_EXHAUSTED_NO_RESULTS_AVAILABLE
Definition diagbib1.h:41
#define YAZ_BIB1_PRESENT_REQUEST_OUT_OF_RANGE
Definition diagbib1.h:23
#define YAZ_BIB1_RESULT_SET_EXISTS_AND_REPLACE_INDICATOR_OFF
Definition diagbib1.h:31
#define YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS
Definition diagbib1.h:24
#define YAZ_BIB1_TERM_TYPE_UNSUPP
Definition diagbib1.h:104
#define YAZ_BIB1_COMBI_OF_SPECIFIED_DATABASES_UNSUPP
Definition diagbib1.h:33
#define YAZ_BIB1_ONLY_ZERO_STEP_SIZE_SUPPORTED_FOR_SCAN
Definition diagbib1.h:80
#define YAZ_BIB1_RECORD_SYNTAX_UNSUPP
Definition diagbib1.h:114
#define YAZ_BIB1_SCAN_UNSUPP_VALUE_OF_POSITION_IN_RESPONSE
Definition diagbib1.h:108
#define YAZ_BIB1_SPECIFIED_RESULT_SET_DOES_NOT_EXIST
Definition diagbib1.h:40
#define YAZ_BIB1_SERVICE_UNSUPP_FOR_THIS_DATABASE
Definition diagbib1.h:147
Z_OPACRecord * dummy_opac(int num, ODR odr, const char *marc_input)
Definition dummy-opac.c:18
int odr_dumpBER(FILE *f, const char *buf, int len)
Definition dumpber.c:130
const char * yaz_get_esn(Z_RecordComposition *comp)
get element set name from RecordComposition
Definition elementset.c:16
static int log_level
Definition eventl.c:39
Z_FacetList * facet_list_create(ODR odr, int num_facets)
Definition facet.c:216
Z_FacetTerm * facet_term_create_cstr(ODR odr, const char *cstr, Odr_int freq)
Definition facet.c:190
void facet_field_term_set(ODR odr, Z_FacetField *field, Z_FacetTerm *facet_term, int index)
Definition facet.c:209
Z_FacetList * yaz_oi_get_facetlist(Z_OtherInformation **otherInformation)
Definition facet.c:45
void yaz_facet_attr_init(struct yaz_facet_attr *attr_values)
Definition facet.c:69
void yaz_facet_attr_get_z_attributes(const Z_AttributeList *attributes, struct yaz_facet_attr *av)
Definition facet.c:148
Z_FacetField * facet_field_create(ODR odr, Z_AttributeList *attributes, int num_terms)
Definition facet.c:199
Header for the facet utilities.
int ill_APDU(ODR o, ILL_APDU **p, int opt, const char *name)
Definition ill-core.c:12
ILL Package utilities.
char * name
Definition initopt.c:18
int ill_ItemRequest(ODR o, ILL_ItemRequest **p, int opt, const char *name)
Definition item-req.c:12
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_DEBUG
log level: debugging
Definition log.h:44
#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
int odr_geterror(ODR o)
Definition odr.c:78
int odr_offset(ODR o)
Definition odr.c:283
void odr_setbuf(ODR o, char *buf, int len, int can_grow)
Definition odr.c:265
Odr_null * odr_nullval(void)
Definition odr.c:30
char * odr_errmsg(int n)
Definition odr.c:52
void odr_reset(ODR o)
Definition odr.c:224
#define ODR_EXTERNAL_single
Definition odr.h:299
#define ODR_INT_PRINTF
Definition odr.h:49
struct odr * ODR
Definition odr.h:121
nmem_int_t Odr_int
Definition odr.h:47
struct odr_oct Odr_oct
Odr_oct * odr_create_Odr_oct(ODR o, const char *buf, int sz)
Definition odr_mem.c:66
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_strdup(ODR o, const char *str)
Definition odr_mem.c:36
Odr_int odr_atoi(const char *s)
Definition odr_mem.c:146
Odr_oid * odr_oiddup(ODR odr, const Odr_oid *o)
Definition odr_util.c:60
int yaz_oid_is_iso2709(const Odr_oid *oid)
checks if OID refers to MARC transfer syntax
Definition oid_db.c:119
const char * yaz_oid_to_string_buf(const Odr_oid *oid, oid_class *oclass, char *buf)
maps any OID to string (named or dot-notation)
Definition oid_db.c:99
oid_class
Definition oid_db.h:46
const Odr_oid yaz_oid_recsyn_sutrs[]
Definition oid_std.c:68
const Odr_oid yaz_oid_recsyn_grs_1[]
Definition oid_std.c:72
const Odr_oid yaz_oid_recsyn_xml[]
Definition oid_std.c:89
const Odr_oid yaz_oid_recsyn_postscript[]
Definition oid_std.c:76
const Odr_oid yaz_oid_userinfo_facet_1[]
Definition oid_std.c:118
const Odr_oid yaz_oid_recsyn_json[]
Definition oid_std.c:88
const Odr_oid yaz_oid_general_isoill_1[]
Definition oid_std.c:10
const Odr_oid yaz_oid_recsyn_opac[]
Definition oid_std.c:69
const Odr_oid yaz_oid_recsyn_usmarc[]
Definition oid_std.c:43
char * oid_oid_to_dotstring(const Odr_oid *oid, char *oidbuf)
converts OID to string (dot notation)
Definition oid_util.c:59
int oid_oidcmp(const Odr_oid *o1, const Odr_oid *o2)
compares OIDs
Definition oid_util.c:34
short Odr_oid
Definition oid_util.h:42
#define OID_STR_MAX
Definition oid_util.h:40
Header for Z39.50 OtherInfo utilities.
struct Z_IOItemOrder Z_ItemOrder
Definition proto.h:131
Z_External * z_ext_record_xml(ODR o, const char *buf, int len)
encodes EXTERNAL XML record
Definition prt-ext.c:368
Z_External * z_ext_record_sutrs(ODR o, const char *buf, int len)
encodes EXTERNAL SUTRS record
Definition prt-ext.c:373
#define Z_External_update0
Definition prt-ext.h:86
#define Z_External_octet
Definition prt-ext.h:66
#define Z_External_sutrs
Definition prt-ext.h:69
#define Z_External_userFacets
Definition prt-ext.h:100
#define Z_External_CQL
Definition prt-ext.h:93
#define Z_External_update
Definition prt-ext.h:82
#define Z_External_itemOrder
Definition prt-ext.h:76
Z_GenericRecord * dummy_grs_record(int num, ODR o)
Definition read-grs.c:100
char * dummy_marc_record(int num, ODR odr)
Definition read-marc.c:1537
char * dummy_xml_record(int num, ODR odr, const char *esn)
Definition read-marc.c:1623
char * dummy_json_record(int num, ODR odr, const char *esn)
Definition read-marc.c:1682
int bend_assoc_is_alive(bend_association assoc)
Definition seshigh.c:3552
void yaz_snprintf(char *buf, size_t size, const char *fmt,...)
Definition snprintf.c:31
Header for config file reading utilities.
int statserv_main(int argc, char **argv, bend_initresult *(*bend_init)(bend_initrequest *r), void(*bend_close)(void *handle))
Definition statserv.c:1503
Odr_int * protocol_version_num
Definition item-req.h:27
Z_RPNStructure * s2
Definition z-core.h:495
Z_RPNStructure * s1
Definition z-core.h:494
Z_InternationalString * packageName
Definition z-core.h:1126
Z_External * taskSpecificParameters
Definition z-core.h:1131
structure for all known EXTERNALs
Definition prt-ext.h:59
Z_ItemOrder * itemOrder
Definition prt-ext.h:118
Odr_int * indirect_reference
Definition prt-ext.h:61
Z_IUUpdate * update
Definition prt-ext.h:125
union Z_External::@173112132151266201036013025012152147264102163302 u
Z_InternationalString * cql
Definition prt-ext.h:138
int which
Definition prt-ext.h:63
Z_SUTRS * sutrs
Definition prt-ext.h:109
Odr_oid * direct_reference
Definition prt-ext.h:60
Z_FacetList * facetList
Definition prt-ext.h:146
Odr_any * single_ASN1_type
Definition prt-ext.h:104
Odr_oct * octet_aligned
Definition prt-ext.h:105
Z_IU0Update * update0
Definition prt-ext.h:130
char * descriptor
Definition prt-ext.h:62
Z_AttributeList * attributes
Definition z-facet-1.h:36
Z_FacetField ** elements
Definition z-facet-1.h:32
Z_InternationalString * email
Definition zes-order.h:74
Z_InternationalString * name
Definition zes-order.h:72
Z_InternationalString * phone
Definition zes-order.h:73
Z_IORequest * esRequest
Definition zes-order.h:64
Z_IOTaskPackage * taskPackage
Definition zes-order.h:65
union Z_IOItemOrder::@113225050317112125221253116145211063074277065357 u
Z_External * itemRequest
Definition zes-order.h:118
Z_IOResultSetItem * resultSetItem
Definition zes-order.h:117
Z_IOContact * contact
Definition zes-order.h:101
Z_IOBilling * addlBilling
Definition zes-order.h:102
Z_IOOriginPartToKeep * toKeep
Definition zes-order.h:52
Z_IOOriginPartNotToKeep * notToKeep
Definition zes-order.h:53
Z_InternationalString * resultSetId
Definition zes-order.h:112
Odr_int * auxiliaryStatus
Definition zes-order.h:129
Z_External * itemRequest
Definition zes-order.h:122
Z_External * statusOrErrorReport
Definition zes-order.h:123
Z_IOTargetPart * targetPart
Definition zes-order.h:58
Z_IOOriginPartToKeep * originPart
Definition zes-order.h:57
Z_IU0OriginPartToKeep * toKeep
Definition zes-update0.h:55
Z_IU0UpdateEsRequest * esRequest
Definition zes-update0.h:67
union Z_IU0Update::@140334272265254357256316330103157174143216142273 u
Z_InternationalString * databaseName
Definition zes-update.h:84
Z_External * actionQualifier
Definition zes-update.h:87
Z_InternationalString * elementSetName
Definition zes-update.h:86
Z_IUSuppliedRecords_elem ** elements
Definition zes-update.h:132
Z_DiagRec ** globalDiagnostics
Definition zes-update.h:98
Odr_int * updateStatus
Definition zes-update.h:96
Z_IUTaskPackageRecordStructure ** taskPackageRecords
Definition zes-update.h:100
int num_globalDiagnostics
Definition zes-update.h:97
int num_taskPackageRecords
Definition zes-update.h:99
Z_IUCorrelationInfo * correlationInfo
Definition zes-update.h:153
union Z_IUTaskPackageRecordStructure::@002103230220260007104011377065144305003123030153 u
Z_IUOriginPartToKeep * toKeep
Definition zes-update.h:58
Z_IUOriginPartNotToKeep * notToKeep
Definition zes-update.h:59
Z_IUTargetPart * targetPart
Definition zes-update.h:64
Z_IUOriginPartToKeep * originPart
Definition zes-update.h:63
Z_IUUpdateEsRequest * esRequest
Definition zes-update.h:70
union Z_IUUpdate::@375302252062255220165347015335025110327305162376 u
Z_IUUpdateTaskPackage * taskPackage
Definition zes-update.h:71
int which
Definition z-core.h:510
Z_AttributesPlusTerm * attributesPlusTerm
Definition z-core.h:512
union Z_Operand::@072322006164213251104156071070134267373322123052 u
Z_InfoCategory * category
Definition z-core.h:1280
Z_External * externallyDefinedInfo
Definition z-core.h:1285
union Z_OtherInformationUnit::@203311166000256233060143271176054366177037254136 information
Z_OtherInformationUnit ** list
Definition z-core.h:1296
union Z_Query::@270220245041066023256025363242165325012357336235 u
Z_External * type_104
Definition z-core.h:477
Z_RPNQuery * type_1
Definition z-core.h:472
int which
Definition z-core.h:469
Z_RPNStructure * RPNStructure
Definition z-core.h:490
Z_Complex * complex
Definition z-core.h:503
union Z_RPNStructure::@272042053041255367154306203353273370010236313243 u
Z_Operand * simple
Definition z-core.h:502
char * value
Definition srw.h:174
Z_SRW_extra_arg * next
Definition srw.h:175
char * name
Definition srw.h:173
Odr_oct * targetReference
Definition z-estask.h:31
Z_Permissions * permissions
Definition z-estask.h:29
char * creationDateTime
Definition z-estask.h:32
Odr_oid * packageType
Definition z-estask.h:25
Z_IntUnit * retentionTime
Definition z-estask.h:28
Odr_int * taskStatus
Definition z-estask.h:37
Z_InternationalString * description
Definition z-estask.h:30
Z_External * taskSpecificParameters
Definition z-estask.h:40
Z_InternationalString * packageName
Definition z-estask.h:26
Z_DiagRec ** packageDiagnostics
Definition z-estask.h:39
Z_InternationalString * userId
Definition z-estask.h:27
union Z_Term::@023217361022206241314262227377164117366363003164 u
Odr_oct * general
Definition z-core.h:539
int which
Definition z-core.h:537
Information for Z39.50 delete result set handler.
Definition backend.h:182
int delete_status
Definition backend.h:187
char ** setnames
Definition backend.h:185
Information for Z39.50 extended services handler.
Definition backend.h:211
Z_ExtendedServicesRequest * esr
Definition backend.h:213
Z_TaskPackage * taskPackage
Definition backend.h:222
Information for SRU Explain handler.
Definition backend.h:236
char * explain_buf
Definition backend.h:240
char * database
Definition backend.h:241
Information for fetch record handler.
Definition backend.h:98
char * basename
Definition backend.h:107
char * record
Definition backend.h:109
Odr_oid * request_format
Definition backend.h:102
int last_in_set
Definition backend.h:110
Z_RecordComposition * comp
Definition backend.h:103
Odr_oid * output_format
Definition backend.h:111
char * schema
Definition backend.h:115
char * setname
Definition backend.h:99
int surrogate_flag
Definition backend.h:114
char * errstring
Definition backend.h:113
Information for the Init handler.
Definition backend.h:253
int(* bend_scan)(void *handle, bend_scan_rr *rr)
Z39.50 scan handler.
Definition backend.h:306
int records_in_same_charset
whether query_charset also applies to records
Definition backend.h:287
int(* bend_search)(void *handle, bend_search_rr *rr)
SRU/Z39.50 search handler.
Definition backend.h:296
int(* bend_fetch)(void *handle, bend_fetch_rr *rr)
SRU/Z39.50 fetch handler.
Definition backend.h:298
int named_result_sets
whether named result sets are supported (0=disable, 1=enable)
Definition backend.h:317
int(* bend_srw_scan)(void *handle, bend_scan_rr *rr)
SRU scan handler.
Definition backend.h:312
int(* bend_srw_update)(void *handle, bend_update_rr *rr)
SRU record update handler.
Definition backend.h:314
int(* bend_explain)(void *handle, bend_explain_rr *rr)
SRU explain handler.
Definition backend.h:310
int(* bend_sort)(void *handle, bend_sort_rr *rr)
Z39.50 sort handler.
Definition backend.h:294
ODR stream
encoding stream (for results)
Definition backend.h:257
char * query_charset
character set (encoding) for query terms
Definition backend.h:280
int(* bend_esrequest)(void *handle, bend_esrequest_rr *rr)
Z39.50 extended services handler.
Definition backend.h:302
int(* bend_present)(void *handle, bend_present_rr *rr)
SRU/Z39.50 present handler.
Definition backend.h:300
int(* bend_delete)(void *handle, bend_delete_rr *rr)
Z39.50 delete result set handler.
Definition backend.h:304
result for init handler (must be filled by handler)
Definition backend.h:322
void * handle
Definition backend.h:325
char * errstring
Definition backend.h:324
Information for present handler. Does not replace bend_fetch.
Definition backend.h:82
char * errstring
Definition backend.h:94
char * setname
Definition backend.h:83
Information for SRU / Z39.50 scan handler.
Definition backend.h:133
char * scanClause
Definition backend.h:152
Z_SRW_extra_arg * extra_args
Definition backend.h:154
Z_AttributesPlusTerm * term
Definition backend.h:138
int num_entries
Definition backend.h:144
bend_scan_status status
Definition backend.h:149
int term_position
Definition backend.h:143
char ** basenames
Definition backend.h:135
char * errstring
Definition backend.h:151
int * step_size
Definition backend.h:142
struct scan_entry * entries
Definition backend.h:148
char * extra_response_data
Definition backend.h:155
Information for Z39.50/SRU search handler.
Definition backend.h:54
char ** basenames
Definition backend.h:58
Odr_int hits
Definition backend.h:66
char * errstring
Definition backend.h:68
Z_OtherInformation * search_input
Definition backend.h:77
char * setname
Definition backend.h:55
int estimated_hit_count
Definition backend.h:73
Z_SRW_extra_arg * extra_args
Definition backend.h:75
Z_OtherInformation * search_info
Definition backend.h:69
int replace_set
Definition backend.h:56
char * extra_response_data
Definition backend.h:76
Z_Query * query
Definition backend.h:60
bend_association association
Definition backend.h:65
Information for Z39.50 sort handler.
Definition backend.h:195
int sort_status
Definition backend.h:204
Information for SRU record update handler.
Definition backend.h:159
char * operation_status
Definition backend.h:166
Definition ztest.c:44
double d2
Definition ztest.c:46
double d1
Definition ztest.c:45
int len
Definition odr.h:102
char * buf
Definition odr.h:101
Definition odr.h:125
struct delay search_delay
Definition ztest.c:53
char * name
Definition ztest.c:50
struct delay fetch_delay
Definition ztest.c:55
char * db
Definition ztest.c:51
Odr_int hits
Definition ztest.c:52
struct result_set * next
Definition ztest.c:56
struct delay present_delay
Definition ztest.c:54
Information for scan entry.
Definition backend.h:119
char * term
Definition backend.h:120
int errcode
Definition backend.h:122
char * errstring
Definition backend.h:123
Odr_int occurrences
Definition backend.h:121
struct result_set * result_sets
Definition ztest.c:60
int sortorder
Definition facet.h:60
char * errstring
Definition facet.h:55
const char * useattr
Definition facet.h:56
int yaz_uri_to_array(const char *path, ODR o, char ***name, char ***val)
Definition uri.c:122
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
WRBUF wrbuf_alloc(void)
construct WRBUF
Definition wrbuf.c:25
void wrbuf_xmlputs(WRBUF b, const char *cp)
writes C-String to WRBUF and XML encode (as CDATA)
Definition wrbuf.c:138
void wrbuf_puts(WRBUF b, const char *buf)
appends C-string to WRBUF
Definition wrbuf.c:89
void wrbuf_write(WRBUF b, const char *buf, size_t size)
append constant size buffer to WRBUF
Definition wrbuf.c:68
struct wrbuf * WRBUF
#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
#define yaz_islower(x)
Definition yaz-iconv.h:91
#define yaz_toupper(x)
Definition yaz-iconv.h:88
#define Z_SortResponse_success
Definition z-core.h:1046
#define Z_Operand_APT
Definition z-core.h:515
#define Z_DeleteStatus_success
Definition z-core.h:850
#define Z_Term_general
Definition z-core.h:547
#define Z_Query_type_1
Definition z-core.h:479
#define Z_OtherInfo_externallyDefinedInfo
Definition z-core.h:1289
#define Z_DeleteStatus_resultSetDidNotExist
Definition z-core.h:851
#define Z_Query_type_101
Definition z-core.h:482
#define Z_RPNStructure_complex
Definition z-core.h:505
#define Z_RPNStructure_simple
Definition z-core.h:504
#define Z_Query_type_104
Definition z-core.h:484
#define Z_IOItemOrder_taskPackage
Definition zes-order.h:67
#define Z_IOItemOrder_esRequest
Definition zes-order.h:66
#define Z_IUOriginPartToKeep_recordInsert
Definition zes-update.h:78
#define Z_IUOriginPartToKeep_recordReplace
Definition zes-update.h:79
#define Z_IUUpdate_esRequest
Definition zes-update.h:72
#define Z_IUTaskPackageRecordStructure_record
Definition zes-update.h:150
#define Z_IUOriginPartToKeep_recordDelete
Definition zes-update.h:80
#define Z_IUOriginPartToKeep_elementUpdate
Definition zes-update.h:81
#define Z_IUTaskPackageRecordStructure_success
Definition zes-update.h:154
#define Z_IUOriginPartToKeep_specialUpdate
Definition zes-update.h:82
#define Z_IUUpdate_taskPackage
Definition zes-update.h:73
static void echo_extra_args(ODR stream, Z_SRW_extra_arg *extra_args, char **extra_response)
Definition ztest.c:319
int ztest_present(void *handle, bend_present_rr *rr)
Definition ztest.c:826
int ztest_fetch(void *handle, bend_fetch_rr *r)
Definition ztest.c:842
int ztest_sort(void *handle, bend_sort_rr *rr)
Definition ztest.c:817
void bend_close(void *handle)
Definition ztest.c:1167
bend_initresult * bend_init(bend_initrequest *q)
Definition ztest.c:1130
int main(int argc, char **argv)
Definition ztest.c:1175
static Odr_int get_hit_count(Z_Query *q)
gets hit count for numeric terms in RPN queries
Definition ztest.c:147
static void addterms(ODR odr, Z_FacetField *facet_field, const char *facet_name)
Definition ztest.c:253
Z_OtherInformation * build_facet_response(ODR odr, Z_FacetList *facet_list)
Definition ztest.c:272
static Odr_int get_term_hit(Z_RPNStructure *s, unsigned *hash)
use term value as hit count
Definition ztest.c:101
int ztest_scan(void *handle, bend_scan_rr *q)
Definition ztest.c:991
static void init_delay(struct delay *delayp)
Definition ztest.c:213
static int parse_delay(struct delay *delayp, const char *value)
Definition ztest.c:218
int ztest_explain(void *handle, bend_explain_rr *rr)
Definition ztest.c:1110
static int strcmp_prefix(const char *s, const char *p)
Definition ztest.c:205
static struct result_set * get_set(struct session_handle *sh, const char *name)
Definition ztest.c:69
int ztest_search(void *handle, bend_search_rr *rr)
Definition ztest.c:347
static void do_delay(const struct delay *delayp)
Definition ztest.c:241
int ztest_update(void *handle, bend_update_rr *rr)
Definition ztest.c:1124
static void ztest_sleep(double d)
Definition ztest.c:229
int ztest_esrequest(void *handle, bend_esrequest_rr *rr)
Definition ztest.c:449
int ztest_delete(void *handle, bend_delete_rr *rr)
Definition ztest.c:807
static int check_slow(const char *basename, bend_association association)
checks if it's a dummy Slow database
Definition ztest.c:181
static void remove_sets(struct session_handle *sh)
Definition ztest.c:78
static int log_level_set
Definition ztest.c:42
Internal header for yaz-ztest.