Add include
[yaz-moved-to-github.git] / srwapps / srw-client.c
1 /* $Id: srw-client.c,v 1.2 2003-01-13 14:32:41 adam Exp $
2    Copyright (C) 2002-2003
3    Index Data Aps
4
5 This file is part of the YAZ toolkit.
6
7 See file LICENSE for details.
8 */
9
10 #include <stdio.h>
11
12 #include <yaz/options.h>
13 #include <yaz/srw-util.h>
14
15 int main (int argc, char **argv)
16 {
17     struct soap soap;
18     char *action;
19     int ret;
20     struct zs__searchRetrieveResponse res;
21     char * query = 0;
22     struct xcql__operandType *xQuery = 0;
23     xsd__integer startRecord = 1;
24     xsd__integer maximumRecord = 0;
25     char *recordSchema = "http://www.loc.gov/marcxml/";
26     xsd__string recordPacking = 0;
27     char *service = 0;
28     int xcql = 0;
29     int explain = 0;
30     char *arg;
31
32     while ((ret = options("er:xs:", argv, argc, &arg)) != -2)
33     {
34         switch(ret)
35         {
36         case 0:
37             if (!service)
38                 service = arg;
39             else if (!query)
40                 query = arg;
41             break;
42         case 'e':
43             explain = 1;
44             break;
45         case 'r':
46             sscanf (arg, "%d,%d", &startRecord, &maximumRecord);
47             break;
48         case 'x':
49             xcql = 1;
50             break;
51         case 's':
52             recordSchema = arg;
53         }
54     }
55     if (!query)
56     {
57         printf ("usage:\n srw-client");
58         printf (" [-e] [-r start,number] [-x] [-s schema] <service> <query>\n");
59         printf ("  http://localhost:8001/indexdata.dk/gils computer\n");
60         exit (1);
61     }
62     soap_init(&soap);
63     soap.namespaces = srw_namespaces;
64
65     if (explain)
66     {
67         struct zs__explainResponse eres;
68         ret = soap_call_zs__explainRequest(&soap, service, action,
69                                            &eres);
70         if (ret == SOAP_OK)
71         {
72             if (eres.Explain)
73                 printf ("%s\n", eres.Explain);
74             else
75                 printf ("no record\n");
76         }
77         else
78             soap_print_fault(&soap, stderr);
79     }
80
81     if (xcql)   /* xquery */
82     {   /* just a hacked query for testing .. */
83         struct xcql__searchClauseType *sc1, *sc2;
84         struct xcql__relationType *relation;
85         struct xcql__tripleType *triple;
86         xQuery = soap_malloc (&soap, sizeof(*xQuery));
87         sc1 = soap_malloc (&soap, sizeof(*sc1));
88         sc1->prefixes = 0;
89         sc1->index = "dc.title";
90         relation = sc1->relation = soap_malloc(&soap, sizeof(*relation));
91         sc1->term = "computer";
92         relation->value = "=";
93         relation->modifiers = 0;
94         
95         sc2 = soap_malloc (&soap, sizeof(*sc2));
96         sc2->prefixes = 0;
97         sc2->index = "dc.author";
98         relation = sc2->relation = soap_malloc(&soap, sizeof(*relation));
99         sc2->term = "knuth";
100         relation->value = "=";
101         relation->modifiers =
102             soap_malloc (&soap, sizeof(*relation->modifiers));
103         relation->modifiers->__sizeModifier = 1;
104         relation->modifiers->modifier = 
105             soap_malloc (&soap, sizeof(*relation->modifiers->modifier));
106         relation->modifiers->modifier[0] = 
107                 soap_malloc (&soap, sizeof(**relation->modifiers->modifier));
108         relation->modifiers->modifier[0]->type = 0;
109         relation->modifiers->modifier[0]->value =  soap_malloc (&soap, 6);
110         strcpy(relation->modifiers->modifier[0]->value, "fuzzy");
111         ;
112         triple = soap_malloc (&soap, sizeof(*triple));
113         triple->prefixes = 0;
114         triple->boolean = soap_malloc (&soap, sizeof(*triple->boolean));
115         triple->boolean->value = "and";
116         triple->boolean->modifiers = 0;
117         triple->leftOperand =
118             soap_malloc (&soap, sizeof(*triple->leftOperand));
119         triple->leftOperand->searchClause = sc1;
120         triple->rightOperand =
121             soap_malloc (&soap, sizeof(*triple->rightOperand));
122         triple->rightOperand->searchClause = sc2;
123         xQuery->triple = triple;
124         query = 0;
125     }
126
127     ret = soap_call_zs__searchRetrieveRequest(&soap, service, action,
128                                               &query, xQuery, 
129                                               0, 0,
130                                               &startRecord,
131                                               &maximumRecord,
132                                               &recordSchema,
133                                               &recordPacking,
134                                               &res);
135
136     if (ret == SOAP_OK)
137     {
138         if (res.diagnostics.__sizeDiagnostics > 0)
139         {
140             int i;
141             for (i = 0; i < 
142                      res.diagnostics.__sizeDiagnostics;
143                  i++)
144             {
145                 int code = res.diagnostics.diagnostic[i]->code;
146                 char *details =
147                     res.diagnostics.diagnostic[i]->details;
148                 printf ("error = %d", code);
149                 if (details)
150                     printf (" details = %s", details);
151                 printf ("\n");
152             }
153         }
154         else
155         {
156             int i;
157             if (res.resultSetId)
158                 printf ("set: %s\n", res.resultSetId);
159             printf ("numberOfRecords: %d\n", res.numberOfRecords);
160             for (i = 0; i<res.records.__sizeRecords;
161                  i++)
162             {
163                 if (res.records.record[i]->recordData)
164                 {
165                     printf ("rec %d schema=%s string:\n%s\n", i+1,
166                             res.records.record[i]->recordSchema,
167                             res.records.record[i]->recordData);
168                 }
169             }
170         }
171     }
172     else
173     {
174         soap_print_fault(&soap, stderr);
175     }
176     soap_end(&soap);
177     exit (0);
178     return 0;
179 }
180