parsing of SRW request packages, and sending of Z3950 init, search and present almost...
[metaproxy-moved-to-github.git] / src / gduutil.cpp
1 /* $Id: gduutil.cpp,v 1.9 2006-09-19 13:50:17 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     {
25         os << "Z3950";
26         if (zgdu.u.z3950)
27             os << *(zgdu.u.z3950);
28     }
29     else if (zgdu.which == Z_GDU_HTTP_Request)
30     {
31         os << "HTTP_Request";
32         if (zgdu.u.HTTP_Request)
33             os << " " << *(zgdu.u.HTTP_Request);
34     }
35     else if (zgdu.which == Z_GDU_HTTP_Response)
36     {
37         os << "HTTP_Response";
38         if (zgdu.u.HTTP_Response)
39             os << " " << *(zgdu.u.HTTP_Response);
40     }
41     else
42         os << "Z_GDU";
43     return os;
44 }
45
46 std::ostream& std::operator<<(std::ostream& os, Z_HTTP_Request& httpreq)
47 {
48     os << httpreq.method << " ";
49     os << httpreq.path;    
50     return os;
51 }
52
53
54 std::ostream& std::operator<<(std::ostream& os, Z_HTTP_Response& httpres)
55 {
56     os << httpres.code << " ";
57     os << httpres.content_len;   
58     return os;
59 }
60
61 std::ostream& std::operator<<(std::ostream& os, Z_Records & rs)
62 {
63     switch(rs.which) {
64     case Z_Records_DBOSD :
65         break;
66     case Z_Records_NSD:
67         if (rs.u.nonSurrogateDiagnostic)
68             os << *(rs.u.nonSurrogateDiagnostic);
69         break;
70     case Z_Records_multipleNSD:
71         os << "Z_Records_multipleNSD";
72         //os << *(rs.u.multipleNonSurDiagnostics);
73         break;
74     default:
75         os << "Z_Records" ;
76     }
77     
78     return os;
79 }
80
81 std::ostream& std::operator<<(std::ostream& os, Z_DiagRec& dr)
82 {
83     switch(dr.which) {
84     case Z_DiagRec_defaultFormat:
85         if (dr.u.defaultFormat)
86             os << *(dr.u.defaultFormat);
87         break;
88     case Z_DiagRec_externallyDefined :
89         os << "Z_DiagRec_externallyDefined";
90         break;
91     default:
92         os << "Z_DiagRec" ;
93     }
94     
95     return os;
96 }
97
98 std::ostream& std::operator<<(std::ostream& os, Z_DefaultDiagFormat& ddf)
99 {
100     if (ddf.condition)
101         os << *(ddf.condition) << " ";
102
103     switch(ddf.which) {
104     case Z_DefaultDiagFormat_v2Addinfo:
105         os << ddf.u.v2Addinfo;
106         break;
107     case Z_DefaultDiagFormat_v3Addinfo:
108         os << ddf.u.v3Addinfo;
109         break;
110     default:
111         os << "Z_DefaultDiagFormat" ;
112     }
113     
114     return os;
115 }
116
117 std::ostream& std::operator<<(std::ostream& os,  Z_APDU& zapdu)
118 {
119     switch(zapdu.which) {
120
121     case Z_APDU_initRequest:
122         os << " " << "initRequest" << " ";
123                         
124         {
125             Z_InitRequest *ir 
126                 = zapdu.u.initRequest;
127
128             Z_IdAuthentication *a = ir->idAuthentication;
129             if (a && a->which == Z_IdAuthentication_idPass )
130                 os << a->u.idPass->userId << " ";
131             //<< ":" << a->u.idPass->groupId << " ";
132             else
133                 os << "-" << " ";
134
135             std::list<std::string> vhosts;
136             mp::util::get_vhost_otherinfo(ir->otherInfo, vhosts);
137             if (vhosts.size()){
138                 copy(vhosts.begin(), vhosts.end(), 
139                      ostream_iterator<string>(os, " "));
140             }
141                 else
142                     os << "-" << " " ;
143
144             os << (ir->implementationId) << " "
145                 //<< ir->referenceId << " "
146                << (ir->implementationName) << " "
147                << (ir->implementationVersion);
148         }
149         break;
150     case Z_APDU_initResponse:
151         os << " " << "initResponse" << " ";
152         {
153             Z_InitResponse *ir 
154                 = zapdu.u.initResponse;
155             if (ir->result && *(ir->result))
156                 os << "OK" << " "
157                    << (ir->implementationId) << " "
158                     //<< ir->referenceId << " "
159                    << (ir->implementationName) << " "
160                    << (ir->implementationVersion) << " ";
161             else
162                 os << "DIAG";
163         }
164         break;
165     case Z_APDU_searchRequest:
166         os << " " << "searchRequest" << " ";
167         { 
168             Z_SearchRequest *sr 
169                 = zapdu.u.searchRequest;
170                             
171             for (int i = 0; i < sr->num_databaseNames; i++)
172             {
173                 os << sr->databaseNames[i];
174                 if (i+1 ==  sr->num_databaseNames)
175                     os << " ";
176                 else
177                     os << "+";
178             }
179                          
180             WRBUF wr = wrbuf_alloc();
181             yaz_query_to_wrbuf(wr, sr->query);
182             os << wrbuf_buf(wr);
183             wrbuf_free(wr, 1);
184         }
185         break;
186     case Z_APDU_searchResponse:
187         os << " " << "searchResponse" << " ";
188         {
189             Z_SearchResponse *sr 
190                 = zapdu.u.searchResponse;
191             if (sr->searchStatus && *(sr->searchStatus))
192             {
193                 os << "OK";
194                 if (sr->resultCount)
195                     os << " " << *(sr->resultCount);
196                 else
197                     os << " -";
198                 //<< sr->referenceId << " "
199                 if (sr->numberOfRecordsReturned)
200                     os << " " << *(sr->numberOfRecordsReturned);
201                 else
202                     os << " -";
203                 if (sr->nextResultSetPosition)
204                     os << " " << *(sr->nextResultSetPosition);
205                 else
206                     os << " -";
207             }
208             else 
209                 if (sr->records)
210                     os << "DIAG " << *(sr->records);
211                 else
212                     os << "ERROR";
213         }
214         break;
215     case Z_APDU_presentRequest:
216         os << " " << "presentRequest" << " ";
217         {
218             Z_PresentRequest *pr = zapdu.u.presentRequest;
219             os << pr->resultSetId << " "
220                 //<< pr->referenceId << " "
221                << *(pr->resultSetStartPoint) << " "
222                << *(pr->numberOfRecordsRequested);
223         }
224         break;
225     case Z_APDU_presentResponse:
226         os << " " << "presentResponse" << " ";
227         {
228             Z_PresentResponse *pr 
229                 = zapdu.u.presentResponse;
230             if ((pr->presentStatus) && !*(pr->presentStatus))
231             {
232                 os << "OK";
233                 //<< pr->referenceId << " "
234                 if (pr->numberOfRecordsReturned)
235                     os << " " << *(pr->numberOfRecordsReturned);
236                 else
237                     os << " -";
238                 if (pr->nextResultSetPosition)
239                     os << " " << *(pr->nextResultSetPosition);
240                 else
241                     os << " -";
242             }
243             else
244                 if (pr->records)
245                     os << "DIAG " << *(pr->records);
246                 else
247                     os << "ERROR";
248
249             //os << "DIAG" << " "
250             //<< "-" << " "
251             //<< pr->referenceId << " "
252             //<< *(pr->numberOfRecordsReturned) << " "
253             //<< *(pr->nextResultSetPosition);
254         }
255         break;
256     case Z_APDU_deleteResultSetRequest:
257         os << " " << "deleteResultSetRequest";
258         break;
259     case Z_APDU_deleteResultSetResponse:
260         os << " " << "deleteResultSetResponse";
261         break;
262     case Z_APDU_accessControlRequest:
263         os << " " << "accessControlRequest";
264         break;
265     case Z_APDU_accessControlResponse:
266         os << " " << "accessControlResponse";
267         break;
268     case Z_APDU_resourceControlRequest:
269         os << " " << "resourceControlRequest";
270         break;
271     case Z_APDU_resourceControlResponse:
272         os << " " << "resourceControlResponse";
273         break;
274     case Z_APDU_triggerResourceControlRequest:
275         os << " " << "triggerResourceControlRequest";
276         break;
277     case Z_APDU_resourceReportRequest:
278         os << " " << "resourceReportRequest";
279         break;
280     case Z_APDU_resourceReportResponse:
281         os << " " << "resourceReportResponse";
282         break;
283     case Z_APDU_scanRequest:
284         os << " " << "scanRequest" << " ";
285         { 
286             Z_ScanRequest *sr 
287                 = zapdu.u.scanRequest;
288                         
289             if (sr)
290             {
291                 for (int i = 0; i < sr->num_databaseNames; i++)
292                 {
293                     os << sr->databaseNames[i];
294                     if (i+1 ==  sr->num_databaseNames)
295                         os << " ";
296                     else
297                     os << "+";
298                 }
299                 if (sr->numberOfTermsRequested)
300                     os << " " << *(sr->numberOfTermsRequested);
301                 else
302                      os << " -";
303                 if (sr->preferredPositionInResponse)
304                     os << " " << *(sr->preferredPositionInResponse);
305                 else
306                     os << " -";
307                 if (sr->stepSize)
308                     os << " " << *(sr->stepSize);
309                 else
310                     os << " -";
311                 
312                 if (sr->termListAndStartPoint)
313                 {
314                     WRBUF wr = wrbuf_alloc();
315                     yaz_scan_to_wrbuf(wr, sr->termListAndStartPoint, VAL_NONE);
316                     os << wrbuf_buf(wr);
317                     wrbuf_free(wr, 1);
318                 }
319                 else
320                     os << " -";
321             }
322         }
323         break;
324     case Z_APDU_scanResponse:
325         os << " " << "scanResponse" << " ";
326         {
327             Z_ScanResponse *sr 
328                 = zapdu.u.scanResponse;
329             if (sr)
330             {
331                 if ((sr->scanStatus) && !*(sr->scanStatus))
332                 {
333                     os << "OK";
334                     //<< *(sr->scanStatus) << " "
335                     if (sr->numberOfEntriesReturned)
336                         os << " " << *(sr->numberOfEntriesReturned);
337                     else
338                         os << " -";
339                     //<< sr->referenceId << " "
340                     if (sr->positionOfTerm)
341                         os << " " << *(sr->positionOfTerm);
342                     else
343                         os << " -";
344                     if (sr->stepSize)
345                         os << " " << *(sr->stepSize);
346                      else
347                         os << " -";                  
348                 }
349                 else {
350                     os << "ERROR";
351                     if (sr->scanStatus)
352                     {
353                         os << " " << *(sr->scanStatus) << " ";
354                     
355                         switch (*(sr->scanStatus)){
356                         case Z_Scan_success:
357                             os << "success ";
358                             break;
359                         case Z_Scan_partial_1:
360                             os << "partial_1";
361                             break;
362                         case Z_Scan_partial_2:
363                             os << "partial_2";
364                             break;
365                         case Z_Scan_partial_3:
366                             os << "partial_3";
367                             break;
368                         case Z_Scan_partial_4:
369                             os << "partial_4";
370                             break;
371                         case Z_Scan_partial_5:
372                             os << "partial_5";
373                             break;
374                         case Z_Scan_failure:
375                             os << "failure";
376                             break;
377                         default:
378                             os << "unknown";
379                         }
380                     }
381                     if (sr->numberOfEntriesReturned)
382                         os << " " << *(sr->numberOfEntriesReturned);
383                     else
384                         os << " -";
385                 }
386             }
387         }
388         break;
389     case Z_APDU_sortRequest:
390         os << " " << "sortRequest" << " ";
391         break;
392     case Z_APDU_sortResponse:
393         os << " " << "sortResponse" << " ";
394         break;
395     case Z_APDU_segmentRequest:
396         os << " " << "segmentRequest" << " ";
397         break;
398     case Z_APDU_extendedServicesRequest:
399         os << " " << "extendedServicesRequest";
400         { 
401             Z_ExtendedServicesRequest *er 
402                 = zapdu.u.extendedServicesRequest;
403             if (er)
404             {
405                 if (er->function)
406                 {
407                     os << " ";
408                     switch(*(er->function))
409                     {
410                     case Z_ExtendedServicesRequest_create:
411                         os << "create";
412                         break;
413                     case Z_ExtendedServicesRequest_delete:
414                         os << "delete";
415                         break;
416                     case Z_ExtendedServicesRequest_modify:
417                         os << "modify";
418                         break;
419                     default:
420                         os << "unknown";
421                     }
422                 }
423                 else
424                     os << " -";
425                     
426                 
427                 if (er->userId)
428                     os << " " << er->userId ;
429                 else
430                     os << " -";
431                 
432                 if (er->packageName)
433                     os << " " << er->packageName;
434                 else
435                     os << " -";
436                 
437                 if (er->description)
438                     os << " " << er->description;
439                 else
440                     os << " -";
441             }
442         }
443         break;
444     case Z_APDU_extendedServicesResponse:
445         os << " " << "extendedServicesResponse";
446          { 
447              Z_ExtendedServicesResponse *er 
448                  = zapdu.u.extendedServicesResponse;
449              if (er)
450              {
451                  if (er->operationStatus)
452                  {
453                      os << " ";
454                      switch (*(er->operationStatus)){
455                      case Z_ExtendedServicesResponse_done:
456                          os << "OK";
457                          break;
458                      case Z_ExtendedServicesResponse_accepted:
459                          os << "ACCEPT";
460                          break;
461                      case Z_ExtendedServicesResponse_failure:
462                          if (er->num_diagnostics)
463                              os << "DIAG " << **(er->diagnostics);
464                          else
465                              os << "ERROR";
466                          break;
467                      default:
468                          os << "unknown";
469                      }
470                  }
471                  else
472                      os << " -";
473              }
474          }
475         break;
476     case Z_APDU_close:
477         os  << " " << "close" << " ";
478         { 
479             Z_Close  *c 
480                 = zapdu.u.close;
481             if (c)
482             {
483                 if (c->closeReason)
484                 {
485                     os << *(c->closeReason) << " ";
486
487                     switch (*(c->closeReason)) {
488                     case Z_Close_finished:
489                         os << "finished";
490                         break;
491                     case Z_Close_shutdown:
492                         os << "shutdown";
493                         break;
494                     case Z_Close_systemProblem:
495                         os << "systemProblem";
496                         break;
497                     case Z_Close_costLimit:
498                         os << "costLimit";
499                         break;
500                     case Z_Close_resources:
501                         os << "resources";
502                         break;
503                     case Z_Close_securityViolation:
504                         os << "securityViolation";
505                         break;
506                     case Z_Close_protocolError:
507                         os << "protocolError";
508                         break;
509                     case Z_Close_lackOfActivity:
510                         os << "lackOfActivity";
511                         break;
512                     case Z_Close_peerAbort:
513                         os << "peerAbort";
514                         break;
515                     case Z_Close_unspecified:
516                         os << "unspecified";
517                         break;
518                     default:
519                         os << "unknown";
520                     }
521                 }
522                 
523                 if (c->diagnosticInformation)
524                     os << " " << c->diagnosticInformation;
525             }
526         }
527         break;
528     case Z_APDU_duplicateDetectionRequest:
529         os << " " << "duplicateDetectionRequest";
530         break;
531     case Z_APDU_duplicateDetectionResponse:
532         os << " " << "duplicateDetectionResponse";
533         break;
534     default: 
535         os << " " << "Z_APDU " << "UNKNOWN";
536     }
537
538     return os;
539 }
540
541
542 std::ostream& std::operator<<(std::ostream& os, Z_SRW_PDU& srw_pdu) 
543 {
544     os << "SRU";
545     
546     switch(srw_pdu.which) {
547     case  Z_SRW_searchRetrieve_request:
548         os << " " << "searchRetrieveRequest";
549         {
550             Z_SRW_searchRetrieveRequest *sr = srw_pdu.u.request;
551             if (sr)
552             {
553                 if (sr->database)
554                     os << " " << (sr->database);
555                 else
556                     os << " -";
557                 if (sr->startRecord)
558                     os << " " << *(sr->startRecord);
559                 else
560                     os << " -";
561                 if (sr->maximumRecords)
562                     os << " " << *(sr->maximumRecords);
563                 else
564                     os << " -";
565                 if (sr->recordPacking)
566                     os << " " << *(sr->recordPacking);
567                 else
568                     os << " -";
569                 
570                 switch (sr->query_type){
571                 case Z_SRW_query_type_cql:
572                     os << " CQL " << sr->query.cql;
573                     break;
574                 case Z_SRW_query_type_xcql:
575                     os << " XCQL";
576                     break;
577                 case Z_SRW_query_type_pqf:
578                     os << " PQF " << sr->query.pqf;
579                     break;
580                 }
581             }
582         }
583         break;
584     case  Z_SRW_searchRetrieve_response:
585         os << " " << "searchRetrieveResponse";
586         break;
587     case  Z_SRW_explain_request:
588         os << " " << "explainRequest";
589         break;
590     case  Z_SRW_explain_response:
591         os << " " << "explainResponse";
592         break;
593     case  Z_SRW_scan_request:
594         os << " " << "scanRequest";
595         break;
596     case  Z_SRW_scan_response:
597         os << " " << "scanResponse";
598         break;
599     case  Z_SRW_update_request:
600         os << " " << "updateRequest";
601         break;
602     case  Z_SRW_update_response:
603         os << " " << "updateResponse";
604         break;
605     default: 
606         os << " " << "UNKNOWN";    
607     }
608
609     return os;    
610 }
611
612     
613 //         {
614 //             Z_InitRequest *ir 
615 //                 = zapdu.u.initRequest;
616
617 //             Z_IdAuthentication *a = ir->idAuthentication;
618 //             if (a && a->which == Z_IdAuthentication_idPass )
619 //                 os << a->u.idPass->userId << " ";
620 //             //<< ":" << a->u.idPass->groupId << " ";
621 //             else
622 //                 os << "-" << " ";
623
624 //             std::list<std::string> vhosts;
625 //             mp::util::get_vhost_otherinfo(ir->otherInfo, vhosts);
626 //             if (vhosts.size()){
627 //                 copy(vhosts.begin(), vhosts.end(), 
628 //                      ostream_iterator<string>(os, " "));
629 //             }
630 //                 else
631 //                     os << "-" << " " ;
632
633 //             os << (ir->implementationId) << " "
634 //                 //<< ir->referenceId << " "
635 //                << (ir->implementationName) << " "
636 //                << (ir->implementationVersion);
637 //         }
638 //         break;
639 //     case Z_APDU_initResponse:
640 //         os << " " << "initResponse" << " ";
641 //         {
642 //             Z_InitResponse *ir 
643 //                 = zapdu.u.initResponse;
644 //             if (ir->result && *(ir->result))
645 //                 os << "OK" << " "
646 //                    << (ir->implementationId) << " "
647 //                     //<< ir->referenceId << " "
648 //                    << (ir->implementationName) << " "
649 //                    << (ir->implementationVersion) << " ";
650 //             else
651 //                 os << "DIAG";
652 //         }
653 //         break;
654 //     case Z_APDU_searchRequest:
655 //         os << " " << "searchRequest" << " ";
656 //         { 
657 //             Z_SearchRequest *sr 
658 //                 = zapdu.u.searchRequest;
659                             
660 //             for (int i = 0; i < sr->num_databaseNames; i++)
661 //             {
662 //                 os << sr->databaseNames[i];
663 //                 if (i+1 ==  sr->num_databaseNames)
664 //                     os << " ";
665 //                 else
666 //                     os << "+";
667 //             }
668                          
669 //             WRBUF wr = wrbuf_alloc();
670 //             yaz_query_to_wrbuf(wr, sr->query);
671 //             os << wrbuf_buf(wr);
672 //             wrbuf_free(wr, 1);
673 //         }
674 //         break;
675
676
677
678 /*
679  * Local variables:
680  * c-basic-offset: 4
681  * indent-tabs-mode: nil
682  * c-file-style: "stroustrup"
683  * End:
684  * vim: shiftwidth=4 tabstop=8 expandtab
685  */