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