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