Use odr_atoi to decode fake hit count (in term)
[yaz-moved-to-github.git] / ztest / gfs-example.c
1 /* This file is part of the YAZ toolkit.
2  * Copyright (C) 1995-2009 Index Data
3  * See the file LICENSE for details.
4  */
5
6 /** \file
7  * \brief Demonstration of Generic Frontend Server API
8  */
9
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <ctype.h>
13
14 #include <yaz/log.h>
15 #include <yaz/backend.h>
16 #include <yaz/diagbib1.h>
17 #include <yaz/matchstr.h>
18 #include <yaz/snprintf.h>
19
20 static int my_search(void *handle, bend_search_rr *rr)
21 {
22     if (rr->num_bases != 1)
23     {
24         rr->errcode = YAZ_BIB1_COMBI_OF_SPECIFIED_DATABASES_UNSUPP;
25         return 0;
26     }
27     /* Throw Database unavailable if other than Default or Slow */
28     if (!yaz_matchstr (rr->basenames[0], "Default"))
29         ;  /* Default is OK in our test */
30     else
31     {
32         rr->errcode = YAZ_BIB1_DATABASE_UNAVAILABLE;
33         rr->errstring = rr->basenames[0];
34         return 0;
35     }
36
37     rr->hits = 123; /* dummy hit count */
38     return 0;
39 }
40
41 /* retrieval of a single record (present, and piggy back search) */
42 static int my_fetch(void *handle, bend_fetch_rr *r)
43 {
44     const Odr_oid *oid = r->request_format;
45
46     r->last_in_set = 0;
47     r->basename = "Default";
48     r->output_format = r->request_format;
49
50     /* if no record syntax was given assume XML */
51     if (!oid || !oid_oidcmp(oid, yaz_oid_recsyn_xml))
52     {
53         char buf[40];
54         yaz_snprintf(buf, sizeof(buf), "<record>%d</record>\n", r->number);
55         
56         r->record = odr_strdup(r->stream, buf);
57         r->len = strlen(r->record);
58     }
59     else
60     {   /* only xml syntax supported . Return diagnostic */
61         char buf[OID_STR_MAX];
62         r->errcode = YAZ_BIB1_RECORD_SYNTAX_UNSUPP;
63         r->errstring = odr_strdup(r->stream, oid_oid_to_dotstring(oid, buf));
64     }
65     return 0;
66 }
67
68 static bend_initresult *my_init(bend_initrequest *q)
69 {
70     bend_initresult *r = (bend_initresult *)
71         odr_malloc (q->stream, sizeof(*r));
72     int *counter = (int *) xmalloc (sizeof(int));
73
74     *counter = 0;
75     r->errcode = 0;
76     r->errstring = 0;
77     r->handle = counter;         /* user handle, in this case a simple int */
78     q->bend_search = my_search;  /* register search handler */
79     q->bend_fetch = my_fetch;     /* register fetch handle */
80     q->query_charset = "UTF-8";
81     q->records_in_same_charset = 1;
82
83     return r;
84 }
85
86 static void my_close(void *handle)
87 {
88     xfree(handle);              /* release our user-defined handle */
89     return;
90 }
91
92 int main(int argc, char **argv)
93 {
94     return statserv_main(argc, argv, my_init, my_close);
95 }
96 /*
97  * Local variables:
98  * c-basic-offset: 4
99  * c-file-style: "Stroustrup"
100  * indent-tabs-mode: nil
101  * End:
102  * vim: shiftwidth=4 tabstop=8 expandtab
103  */
104