finalized logging output format, using ISO date form and duratio in seconds.fraction...
[metaproxy-moved-to-github.git] / src / gduutil.cpp
1 /* $Id: gduutil.cpp,v 1.3 2006-08-30 14:37:11 marc Exp $
2    Copyright (c) 2005-2006, Index Data.
3
4    See the LICENSE file for details
5 */
6
7 #include "gduutil.hpp"
8 #include "util.hpp"
9
10 #include <yaz/wrbuf.h>
11 #include <yaz/querytowrbuf.h>
12
13 #include <iostream>
14 #include <list>
15
16 namespace mp = metaproxy_1;
17
18 // Doxygen doesn't like mp::gdu, so we use this instead
19 namespace mp_gdu = metaproxy_1::gdu;
20
21 std::ostream& std::operator<<(std::ostream& os,  Z_GDU& zgdu)
22 {
23     if (zgdu.which == Z_GDU_Z3950)
24         os << "Z3950" << " " << *(zgdu.u.z3950) ;
25     else if (zgdu.which == Z_GDU_HTTP_Request)
26         os << "HTTP_Request" << " " << *(zgdu.u.HTTP_Request);
27     else if (zgdu.which == Z_GDU_HTTP_Response)
28         os << "HTTP_Response" << " " << *(zgdu.u.HTTP_Response);
29     else
30         os << "Z_GDU";
31     return os;
32 }
33
34 std::ostream& std::operator<<(std::ostream& os, Z_HTTP_Request& httpreq)
35 {
36     os << httpreq.method << " ";
37     os << httpreq.path;    
38     return os;
39 }
40
41
42 std::ostream& std::operator<<(std::ostream& os, Z_HTTP_Response& httpres)
43 {
44     os << httpres.code << " ";
45     os << httpres.content_len;   
46     return os;
47 }
48
49 std::ostream& std::operator<<(std::ostream& os, Z_Records & rs)
50 {
51     switch(rs.which) {
52     case Z_Records_DBOSD :
53         break;
54     case Z_Records_NSD:
55         os << *(rs.u.nonSurrogateDiagnostic);
56         break;
57     case Z_Records_multipleNSD:
58         os << "Z_Records_multipleNSD";
59         //os << *(rs.u.multipleNonSurDiagnostics);
60         break;
61     default:
62         os << "Z_Records" ;
63     }
64     
65     return os;
66 }
67
68 std::ostream& std::operator<<(std::ostream& os, Z_DiagRec& dr)
69 {
70     switch(dr.which) {
71     case Z_DiagRec_defaultFormat:
72         os << *(dr.u.defaultFormat);
73         break;
74     case Z_DiagRec_externallyDefined :
75         os << "Z_DiagRec_externallyDefined";
76         break;
77     default:
78         os << "Z_DiagRec" ;
79     }
80     
81     return os;
82 }
83
84 std::ostream& std::operator<<(std::ostream& os, Z_DefaultDiagFormat& ddf)
85 {
86     os << *(ddf.condition) << " ";
87     switch(ddf.which) {
88     case Z_DefaultDiagFormat_v2Addinfo:
89         os << ddf.u.v2Addinfo;
90         break;
91     case Z_DefaultDiagFormat_v3Addinfo:
92         os << ddf.u.v3Addinfo;
93         break;
94     default:
95         os << "Z_DefaultDiagFormat" ;
96     }
97     
98     return os;
99 }
100
101 std::ostream& std::operator<<(std::ostream& os,  Z_APDU& zapdu)
102 {
103     switch(zapdu.which) {
104
105     case Z_APDU_initRequest:
106         os << "initRequest" << " ";
107                         
108         {
109             Z_InitRequest *ir 
110                 = zapdu.u.initRequest;
111
112             Z_IdAuthentication *a = ir->idAuthentication;
113             if (a && a->which == Z_IdAuthentication_idPass )
114                 os << a->u.idPass->userId << " ";
115             //<< ":" << a->u.idPass->groupId << " ";
116             else
117                 os << "--" << " ";
118
119             std::list<std::string> vhosts;
120             mp::util::get_vhost_otherinfo(ir->otherInfo, vhosts);
121             if (vhosts.size()){
122                 copy(vhosts.begin(), vhosts.end(), 
123                      ostream_iterator<string>(os, " "));
124             }
125                 else
126                     os << "--" << " " ;
127
128             os << (ir->implementationId) << " "
129                 //<< ir->referenceId << " "
130                << (ir->implementationName) << " "
131                << (ir->implementationVersion);
132         }
133         break;
134     case Z_APDU_initResponse:
135         os << "initResponse" << " ";
136         {
137             Z_InitResponse *ir 
138                 = zapdu.u.initResponse;
139             if (*(ir->result))
140                 os << "OK" << " "
141                    << (ir->implementationId) << " "
142                     //<< ir->referenceId << " "
143                    << (ir->implementationName) << " "
144                    << (ir->implementationVersion) << " ";
145             else
146                 os << "DIAG";
147         }
148         break;
149     case Z_APDU_searchRequest:
150         os << "searchRequest" << " ";
151         { 
152             Z_SearchRequest *sr 
153                 = zapdu.u.searchRequest;
154                             
155             for (int i = 0; i < sr->num_databaseNames; i++)
156             {
157                 os << sr->databaseNames[i];
158                 if (i+1 ==  sr->num_databaseNames)
159                     os << " ";
160                 else
161                     os << "+";
162             }
163                          
164             WRBUF wr = wrbuf_alloc();
165             yaz_query_to_wrbuf(wr, sr->query);
166             os << wrbuf_buf(wr);
167             wrbuf_free(wr, 1);
168         }
169         break;
170     case Z_APDU_searchResponse:
171         os << "searchResponse" << " ";
172         {
173             Z_SearchResponse *sr 
174                 = zapdu.u.searchResponse;
175             if (*(sr->searchStatus))
176                 os << "OK" << " "
177                    << *(sr->resultCount) << " "
178                     //<< sr->referenceId << " "
179                    << *(sr->numberOfRecordsReturned) << " "
180                    << *(sr->nextResultSetPosition);
181             else 
182                 if (sr->records)
183                     os << "DIAG " << *(sr->records);
184                 else
185                     os << "ERROR";
186         }
187         break;
188     case Z_APDU_presentRequest:
189         os << "presentRequest" << " ";
190         {
191             Z_PresentRequest *pr = zapdu.u.presentRequest;
192             os << pr->resultSetId << " "
193                 //<< pr->referenceId << " "
194                << *(pr->resultSetStartPoint) << " "
195                << *(pr->numberOfRecordsRequested);
196         }
197         break;
198     case Z_APDU_presentResponse:
199         os << "presentResponse" << " ";
200         {
201             Z_PresentResponse *pr 
202                 = zapdu.u.presentResponse;
203             if (!*(pr->presentStatus))
204                 os << "OK" << " "
205                     //<< "-" << " "
206                     //<< pr->referenceId << " "
207                    << *(pr->numberOfRecordsReturned) << " "
208                    << *(pr->nextResultSetPosition);
209             else
210                 if (pr->records)
211                     os << "DIAG " << *(pr->records);
212                 else
213                     os << "ERROR";
214
215             //os << "DIAG" << " "
216             //<< "-" << " "
217             //<< pr->referenceId << " "
218             //<< *(pr->numberOfRecordsReturned) << " "
219             //<< *(pr->nextResultSetPosition);
220         }
221         break;
222     case Z_APDU_deleteResultSetRequest:
223         os << "deleteResultSetRequest";
224         break;
225     case Z_APDU_deleteResultSetResponse:
226         os << "deleteResultSetResponse";
227         break;
228     case Z_APDU_accessControlRequest:
229         os << "accessControlRequest";
230         break;
231     case Z_APDU_accessControlResponse:
232         os << "accessControlResponse";
233         break;
234     case Z_APDU_resourceControlRequest:
235         os << "resourceControlRequest";
236         break;
237     case Z_APDU_resourceControlResponse:
238         os << "resourceControlResponse";
239         break;
240     case Z_APDU_triggerResourceControlRequest:
241         os << "triggerResourceControlRequest";
242         break;
243     case Z_APDU_resourceReportRequest:
244         os << "resourceReportRequest";
245         break;
246     case Z_APDU_resourceReportResponse:
247         os << "resourceReportResponse";
248         break;
249     case Z_APDU_scanRequest:
250         os << "scanRequest" << " ";
251         { 
252             Z_ScanRequest *sr 
253                 = zapdu.u.scanRequest;
254                             
255             for (int i = 0; i < sr->num_databaseNames; i++)
256             {
257                 os << sr->databaseNames[i];
258                 if (i+1 ==  sr->num_databaseNames)
259                     os << " ";
260                 else
261                     os << "+";
262             }
263
264             os << *(sr->numberOfTermsRequested) << " "
265                << *(sr->preferredPositionInResponse) << " "
266                << *(sr->stepSize) << " ";
267                          
268             WRBUF wr = wrbuf_alloc();
269             yaz_scan_to_wrbuf(wr, sr->termListAndStartPoint, VAL_NONE);
270             os << wrbuf_buf(wr);
271             wrbuf_free(wr, 1);
272         }
273         break;
274     case Z_APDU_scanResponse:
275         os << "scanResponse" << " ";
276         {
277             Z_ScanResponse *sr 
278                 = zapdu.u.scanResponse;
279             if (!*(sr->scanStatus))
280                 os << "OK" << " "
281                     //<< *(sr->scanStatus) << " "
282                    << *(sr->numberOfEntriesReturned) << " "
283                     //<< sr->referenceId << " "
284                    << *(sr->positionOfTerm) << " "
285                    << *(sr->stepSize) << " ";
286             else {
287                 os << "ERROR" << " "
288                    << *(sr->scanStatus) << " ";
289                 
290                 switch (*(sr->scanStatus)){
291                 case Z_Scan_success:
292                     os << "success ";
293                     break;
294                 case Z_Scan_partial_1:
295                     os << "partial_1";
296                     break;
297                 case Z_Scan_partial_2:
298                     os << "partial_2";
299                     break;
300                 case Z_Scan_partial_3:
301                     os << "partial_3";
302                         break;
303                 case Z_Scan_partial_4:
304                     os << "partial_4";
305                     break;
306                 case Z_Scan_partial_5:
307                     os << "partial_5";
308                     break;
309                 case Z_Scan_failure:
310                     os << "failure";
311                     break;
312                 default:
313                     os << "unknown";
314                 }
315                 
316                 os << " " << *(sr->numberOfEntriesReturned);
317             }
318         }
319         break;
320     case Z_APDU_sortRequest:
321         os << "sortRequest" << " ";
322         break;
323     case Z_APDU_sortResponse:
324         os << "sortResponse" << " ";
325         break;
326     case Z_APDU_segmentRequest:
327         os << "segmentRequest" << " ";
328         break;
329     case Z_APDU_extendedServicesRequest:
330         os << "extendedServicesRequest";
331 //         { 
332 //             Z_ExtendedServicesRequest *er 
333 //                 = zapdu.u.extendedServicesRequest;
334
335 //             os << er->packageName << " "
336 //                << er->userId << " "
337 //                << er->description << " ";
338 //         }
339         break;
340     case Z_APDU_extendedServicesResponse:
341         os << "extendedServicesResponse" << " ";
342 //         { 
343 //             Z_ExtendedServicesResponse *er 
344 //                 = zapdu.u.extendedServicesResponse;
345
346 //             os << *(er->operationStatus) << " "
347 //                << er->num_diagnostics << " ";
348 //         }
349         break;
350     case Z_APDU_close:
351         os  << "close" << " ";
352         { 
353             Z_Close  *c 
354                 = zapdu.u.close;
355
356             os << *(c->closeReason) << " ";
357             switch (*(c->closeReason)) {
358             case Z_Close_finished:
359                 os << "finished";
360                 break;
361             case Z_Close_shutdown:
362                 os << "shutdown";
363                 break;
364             case Z_Close_systemProblem:
365                 os << "systemProblem";
366                 break;
367             case Z_Close_costLimit:
368                 os << "costLimit";
369                 break;
370             case Z_Close_resources:
371                 os << "resources";
372                 break;
373             case Z_Close_securityViolation:
374                 os << "securityViolation";
375                 break;
376             case Z_Close_protocolError:
377                 os << "protocolError";
378                 break;
379             case Z_Close_lackOfActivity:
380                 os << "";
381                 break;
382             case Z_Close_peerAbort:
383                 os << "peerAbort";
384                 break;
385             case Z_Close_unspecified:
386                 os << "unspecified";
387                 break;
388             default:
389                 os << "unknown";
390                 break;
391             }
392         }
393         break;
394     case Z_APDU_duplicateDetectionRequest:
395         os << "duplicateDetectionRequest";
396         break;
397     case Z_APDU_duplicateDetectionResponse:
398         os << "duplicateDetectionResponse";
399         break;
400     default: 
401         os << "Z_APDU "
402            << "UNKNOWN";
403     }
404
405     return os;
406 }
407
408
409 /*
410  * Local variables:
411  * c-basic-offset: 4
412  * indent-tabs-mode: nil
413  * c-file-style: "stroustrup"
414  * End:
415  * vim: shiftwidth=4 tabstop=8 expandtab
416  */