Update for YAZ 3s new OID system
[yazpp-moved-to-github.git] / src / yaz-my-server.cpp
1 /*
2  * Copyright (c) 1998-2001, Index Data.
3  * See the file LICENSE for details.
4  * 
5  * $Id: yaz-my-server.cpp,v 1.21 2007-04-12 15:00:33 adam Exp $
6  */
7
8 #include <stdlib.h>
9 #include <yaz/log.h>
10 #include <yaz/diagbib1.h>
11 #include <yaz/options.h>
12 #include <yazpp/z-server.h>
13 #include <yazpp/pdu-assoc.h>
14 #include <yazpp/socket-manager.h>
15 #include <yaz/oid_db.h>
16
17 using namespace yazpp_1;
18
19 class MyILL : public Yaz_Facility_ILL {
20 public:
21     void ill_service (Z_ExtendedServicesRequest *req,
22                       Z_ItemOrder *io,
23                       Z_ExtendedServicesResponse *res);
24 };
25
26 class MyUpdate : public Yaz_Facility_Update {
27 public:
28     void update_service (Z_ExtendedServicesRequest *req,
29                          Z_IUUpdate *io,
30                          Z_ExtendedServicesResponse *res);
31     void update_service0 (Z_ExtendedServicesRequest *req,
32                          Z_IU0Update *io,
33                          Z_ExtendedServicesResponse *res);
34 };
35
36
37 class MyRetrieval : public Yaz_Facility_Retrieval, Yaz_USMARC {
38 public:
39     int sr_init (Z_InitRequest *initRequest,
40                  Z_InitResponse *initResponse);
41     void sr_search (Z_SearchRequest *searchRequest,
42                         Z_SearchResponse *searchResponse);
43     void sr_present (Z_PresentRequest *presentRequest,
44                          Z_PresentResponse *presentResponse);
45     void sr_record (const char *resultSetName,
46                     int position,
47                     int *format,
48                     Z_RecordComposition *comp,
49                     Z_NamePlusRecord *namePlusRecord,
50                     Z_Records *records);
51 };
52
53 class MyServer : public Z_Server {
54 public:
55     ~MyServer();
56     MyServer(IPDU_Observable *the_PDU_Observable);
57     IPDU_Observer* sessionNotify(IPDU_Observable *the_PDU_Observable,
58                                  int fd);
59     void failNotify();
60     void timeoutNotify();
61     void connectNotify();
62
63 private:
64     MyRetrieval m_retrieval;
65     MyILL       m_ill;
66     MyUpdate    m_update;
67     int m_no;
68 };
69
70 void MyILL::ill_service (Z_ExtendedServicesRequest *req,
71                          Z_ItemOrder *io,
72                          Z_ExtendedServicesResponse *res)
73 {
74     yaz_log (YLOG_LOG, "MyServer::ill_service");
75 }
76
77 void MyUpdate::update_service (Z_ExtendedServicesRequest *req,
78                            Z_IUUpdate *io,
79                            Z_ExtendedServicesResponse *res)
80 {
81     yaz_log (YLOG_LOG, "MyServer::update_service (v1.1)");
82 }
83
84 void MyUpdate::update_service0 (Z_ExtendedServicesRequest *req,
85                            Z_IU0Update *io,
86                                 Z_ExtendedServicesResponse *res)
87 {
88     yaz_log (YLOG_LOG, "MyServer::update_service (v1.0)");
89 }
90
91 int MyRetrieval::sr_init (Z_InitRequest *initRequest,
92                        Z_InitResponse *initResponse)
93 {
94     yaz_log (YLOG_LOG, "MyServer::sr_init");
95     return 1;
96 }
97
98 void MyRetrieval::sr_search (Z_SearchRequest *searchRequest,
99                              Z_SearchResponse *searchResponse)
100 {
101     yaz_log (YLOG_LOG, "MyServer::recv_Z_search");
102     if (searchRequest->query->which == Z_Query_type_1)
103     {
104         Z_RPNStructure *s = searchRequest->query->u.type_1->RPNStructure;
105         if (s->which == Z_RPNStructure_simple &&
106             s->u.simple->which == Z_Operand_APT &&
107             s->u.simple->u.attributesPlusTerm->term->which == Z_Term_general)
108         {
109             Odr_oct *term = s->u.simple->u.attributesPlusTerm->term->u.general;
110             char *str = (char *) odr_malloc (odr_encode(), term->len+1);
111             if (term->len)
112                 memcpy (str, term->buf, term->len);
113             str[term->len] = '\0';
114             *searchResponse->resultCount = atoi(str);
115         }
116     }
117 }
118
119 void MyRetrieval::sr_present (Z_PresentRequest *presentRequest,
120                                Z_PresentResponse *presentResponse)
121 {
122     yaz_log (YLOG_LOG, "MyServer::recv_Z_present");
123 }
124
125 void MyRetrieval::sr_record (const char *resultSetName,
126                              int position,
127                              int *format,
128                              Z_RecordComposition *comp,
129                              Z_NamePlusRecord *namePlusRecord,
130                              Z_Records *records)
131 {
132     yaz_log (YLOG_LOG, "MyServer::recv_Z_record");
133     const char *rec = get_record(position);
134     if (rec)
135         create_databaseRecord(odr_encode(), namePlusRecord, 0,
136                               OID_STR_USMARC, rec, strlen(rec));
137     else
138         create_surrogateDiagnostics(odr_encode(), namePlusRecord, 0,
139                                     YAZ_BIB1_PRESENT_REQUEST_OUT_OF_RANGE, 0);
140 }
141
142 MyServer::~MyServer()
143 {
144 }
145
146 IPDU_Observer *MyServer::sessionNotify(
147     IPDU_Observable *the_PDU_Observable, int fd)
148 {
149     MyServer *new_server;
150     m_no++;
151     new_server = new MyServer(the_PDU_Observable);
152     new_server->timeout(900);
153     new_server->facility_add(&new_server->m_retrieval, "my sr");
154     new_server->facility_add(&new_server->m_ill, "my ill");
155     new_server->facility_add(&new_server->m_update, "my update");
156     new_server->set_APDU_log(get_APDU_log());
157
158     return new_server;
159 }
160
161 MyServer::MyServer(IPDU_Observable *the_PDU_Observable) :
162     Z_Server (the_PDU_Observable)
163 {
164     m_no = 0;
165 }
166
167 void MyServer::timeoutNotify()
168 {
169     yaz_log (YLOG_LOG, "connection timed out");
170     delete this;
171 }
172
173 void MyServer::failNotify()
174 {
175     yaz_log (YLOG_LOG, "connection closed by client");
176     delete this;
177 }
178
179 void MyServer::connectNotify()
180 {
181 }
182
183 void usage(const char *prog)
184 {
185     fprintf (stderr, "%s: [-a log] [-v level] [-T] @:port\n", prog);
186     exit (1);
187 }
188
189 int main(int argc, char **argv)
190 {
191     int thread_flag = 0;
192     char *arg;
193     char *prog = *argv;
194     const char *addr = "tcp:@:9999";
195     char *apdu_log = 0;
196     
197     SocketManager mySocketManager;
198     
199     PDU_Assoc *my_PDU_Assoc = 0;
200     
201     MyServer *z = 0;
202     int ret;
203     
204     while ((ret = options("a:v:T", argv, argc, &arg)) != -2)
205     {
206         switch (ret)
207         {
208         case 0:
209             addr = xstrdup(arg);
210             break;
211         case 'a':
212             apdu_log = xstrdup(arg);
213             break;
214         case 'v':
215             yaz_log_init_level (yaz_log_mask_str(arg));
216             break;
217         case 'T':
218             thread_flag = 1;
219             break;
220         default:
221             usage(prog);
222             return 1;
223         }
224     }
225 #if YAZ_POSIX_THREADS
226     if (thread_flag)
227         my_PDU_Assoc = new PDU_AssocThread(&mySocketManager);
228     else
229         my_PDU_Assoc = new PDU_Assoc(&mySocketManager);
230 #else
231     my_PDU_Assoc = new PDU_Assoc(&mySocketManager);
232 #endif
233     
234     z = new MyServer(my_PDU_Assoc);
235     z->server(addr);
236     if (apdu_log)
237     {
238         yaz_log (YLOG_LOG, "set_APDU_log %s", apdu_log);
239         z->set_APDU_log(apdu_log);
240     }
241
242     while (mySocketManager.processEvent() > 0)
243         ;
244     delete z;
245     return 0;
246 }
247 /*
248  * Local variables:
249  * c-basic-offset: 4
250  * indent-tabs-mode: nil
251  * End:
252  * vim: shiftwidth=4 tabstop=8 expandtab
253  */
254