Version 5.14.8
[yaz-moved-to-github.git] / include / yaz / backend.h
1 /* This file is part of the YAZ toolkit.
2  * Copyright (C) Index Data.
3  * All rights reserved.
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
7  *     * Redistributions of source code must retain the above copyright
8  *       notice, this list of conditions and the following disclaimer.
9  *     * Redistributions in binary form must reproduce the above copyright
10  *       notice, this list of conditions and the following disclaimer in the
11  *       documentation and/or other materials provided with the distribution.
12  *     * Neither the name of Index Data nor the names of its contributors
13  *       may be used to endorse or promote products derived from this
14  *       software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27
28 /**
29  * \file backend.h
30  * \brief Header for GFS
31  *
32  * This header includes all public definitions for the
33  * Generic Frontend Server (GFS).
34  */
35
36 #ifndef BACKEND_H
37 #define BACKEND_H
38
39 #include <yaz/yconfig.h>
40 #include <yaz/proto.h>
41 #include <yaz/srw.h>
42 #include <yaz/oid_db.h>
43
44 YAZ_BEGIN_CDECL
45
46 typedef struct association *bend_association;
47
48 /** \brief Information for Z39.50/SRU search handler
49
50     This structure is passed to the search handler. Some members
51     are read-only (input), some are read-write (input and ouput),
52     and others are write-only.
53  */
54 typedef struct {
55     char *setname;             /**< result set ID (input) */
56     int replace_set;           /**< replace set indicator (input) */
57     int num_bases;             /**< number of databases (input) */
58     char **basenames;          /**< databases to search (input) */
59     Z_ReferenceId *referenceId;/**< reference ID (input) */
60     Z_Query *query;            /**< query structure (input) */
61     ODR stream;                /**< encode stream (input) */
62     ODR decode;                /**< decode stream (input) */
63     ODR print;                 /**< print stream (input) */
64
65     bend_association association; /**< GFS association / session (input) */
66     Odr_int hits;              /**< hits (output) */
67     int errcode;               /**< Diagnostic code / 0 for no error (output) */
68     char *errstring;           /**< Additional info (output) */
69     Z_OtherInformation *search_info; /**< extra search info result (output) */
70     char *srw_sortKeys;        /**< SRU sortKeys info (input) */
71     char *srw_setname;         /**< SRU generated resultsetID (output) */
72     int *srw_setnameIdleTime;  /**< SRU result set idle time (output) */
73     int estimated_hit_count;   /**< 1=estimated hits; 0=exact (output) */
74     int partial_resultset;     /**< 1=partial results; 0=full (output)*/
75     Z_SRW_extra_arg *extra_args; /**< SRU extra request parameters (input) */
76     char *extra_response_data;   /**< SRW extra XML response (output) */
77     Z_OtherInformation *search_input; /**< extra search info request (input) */
78     Odr_int present_number;    /**<  piggyback present number (>0) (input) */
79 } bend_search_rr;
80
81 /** \brief Information for present handler. Does not replace bend_fetch. */
82 typedef struct {
83     char *setname;             /**< result set ID (input) */
84     int start;                 /**< range start, starting from 1 (input) */
85     int number;                /**< number of records to fetch (input) */
86     Odr_oid *format;           /**< record syntax OID (input) */
87     Z_ReferenceId *referenceId;/**< reference ID (input) */
88     Z_RecordComposition *comp; /**< Formatting instructions (input) */
89     ODR stream;                /**< encoding stream (input) */
90     ODR print;                 /**< printing stream (input) */
91     bend_association association; /**< GFS association / session (input) */
92
93     int errcode;               /**< Diagnostic code / 0 for no error (output) */
94     char *errstring;           /**< Additional info (output) */
95 } bend_present_rr;
96
97 /** \brief Information for fetch record handler */
98 typedef struct bend_fetch_rr {
99     char *setname;             /**< result set ID (input) */
100     int number;                /**< record position (1,2,etc) (input) */
101     Z_ReferenceId *referenceId;/**< reference ID (input) */
102     Odr_oid *request_format;   /**< record syntax OID (input) */
103     Z_RecordComposition *comp; /**< Formatting instructions (input) */
104     ODR stream;                /**< encoding stream (input) */
105     ODR print;                 /**< printing stream (input) */
106
107     char *basename;            /**< name of database for record (output) */
108     int len;                   /**< record length or -1 if structured (output)*/
109     char *record;              /**< record buffer (output) */
110     int last_in_set;           /**< 1=last in set; 0=not last (output)  */
111     Odr_oid *output_format;    /**< record syntax OIT (output) */
112     int errcode;               /**< Diagnostic code / 0 for no error (output) */
113     char *errstring;           /**< Additional info (output) */
114     int surrogate_flag;        /**< 1=surrogate diagnostic(SD); 0=NSD (output)*/
115     char *schema;              /**< string record schema (input/output) */
116 } bend_fetch_rr;
117
118 /** \brief Information for scan entry */
119 struct scan_entry {
120     char *term;         /**< the returned scan term (output) */
121     Odr_int occurrences;/**< >=hits or -1 if error (output) */
122     int errcode;        /**< Bib-1 diagnostic; only when occur = -1 (output) */
123     char *errstring;    /**< Additional string (output) */
124     char *display_term;
125 };
126
127 typedef enum {
128     BEND_SCAN_SUCCESS,  /**< ok */
129     BEND_SCAN_PARTIAL   /**< not all entries could be found */
130 } bend_scan_status;
131
132 /** \brief Information for SRU / Z39.50 scan handler */
133 typedef struct bend_scan_rr {
134     int num_bases;      /**< number of databases (input) */
135     char **basenames;   /**< databases to scan (input) */
136     Odr_oid *attributeset; /**< attribute-set for term (input) */
137     Z_ReferenceId *referenceId; /**< reference ID (input) */
138     Z_AttributesPlusTerm *term; /**< start term (input) */
139     ODR stream;         /**< encoding stream (input) */
140     ODR print;          /**< printing stream (input) */
141
142     int *step_size;     /**< step size */
143     int term_position;  /**< desired index of term in result list/returned */
144     int num_entries;    /**< number of entries requested/returned */
145
146     /* scan term entries. The called handler does not have
147        to allocate this. Size of entries is num_entries (see above) */
148     struct scan_entry *entries;
149     bend_scan_status status;
150     int errcode;
151     char *errstring;
152     char *scanClause;   /**< CQL scan clause */
153     char *setname;      /**< Scan in result set (NULL if omitted) */
154     Z_SRW_extra_arg *extra_args; /**< SRU extra request parameters (input) */
155     char *extra_response_data;   /**< SRW extra XML response (output) */
156 } bend_scan_rr;
157
158 /** \brief Information for SRU record update handler */
159 typedef struct bend_update_rr {
160     int num_bases;      /**< number of databases (input) */
161     char **basenames;   /**< databases to update (input) */
162     Z_ReferenceId *referenceId; /**< reference ID (input) */
163     ODR stream;         /**< encoding stream (input) */
164     ODR print;          /**< printing stream (input) */
165     char *operation;
166     char *operation_status;
167     char *record_id;
168     Z_SRW_recordVersion *record_versions;
169     int num_versions;
170     char *record_packing;
171     char *record_schema;
172     char *record_data;
173     char *extra_record_data;
174     char *extra_request_data;
175     char *extra_response_data;
176     char *uri;
177     char *message;
178     char *details;
179 } bend_update_rr;
180
181 /** \brief Information for Z39.50 delete result set handler */
182 typedef struct bend_delete_rr {
183     int function;
184     int num_setnames;
185     char **setnames;
186     Z_ReferenceId *referenceId;
187     int delete_status;    /**< status for the whole operation */
188     int *statuses;    /**< status each set - indexed as setnames */
189     ODR stream;
190     ODR print;
191 } bend_delete_rr;
192
193 /** \brief Information for Z39.50 sort handler */
194 typedef struct bend_sort_rr
195 {
196     int num_input_setnames;
197     char **input_setnames;
198     char *output_setname;
199     Z_SortKeySpecList *sort_sequence;
200     ODR stream;
201     ODR print;
202     Z_ReferenceId *referenceId;
203
204     int sort_status;
205     int errcode;
206     char *errstring;
207 } bend_sort_rr;
208
209 /** \brief Information for Z39.50 extended services handler */
210 typedef struct bend_esrequest_rr
211 {
212     int ItemNo;
213     Z_ExtendedServicesRequest *esr;
214
215     ODR stream;                /* encoding stream */
216     ODR decode;                /* decoding stream */
217     ODR print;                 /* printing stream */
218     Z_ReferenceId *referenceId;/* reference ID */
219     bend_association association;
220     int errcode;               /* 0==success, -1==accepted, >0 = failure */
221     char *errstring;           /* system error string or NULL */
222     Z_TaskPackage *taskPackage;
223 } bend_esrequest_rr;
224
225 /** \brief Information for Z39.50 segment handler */
226 typedef struct bend_segment_rr {
227     Z_Segment *segment;
228     ODR stream;
229     ODR decode;
230     ODR print;
231     bend_association association;
232 } bend_segment_rr;
233
234 /** \brief Information for SRU Explain handler */
235 typedef struct {
236     ODR stream;
237     ODR decode;
238     ODR print;
239     char *explain_buf;
240     char *database;
241     char *schema;
242     void *server_node_ptr;
243 } bend_explain_rr;
244
245 /** \brief Information for the Init handler
246
247 This includes both request
248 information (to be read) and response information which should be
249 set by the bend_init handler
250 */
251 typedef struct bend_initrequest
252 {
253     /** \brief user/name/password to be read */
254     Z_IdAuthentication *auth;
255     /** \brief encoding stream (for results) */
256     ODR stream;
257     /** \brief printing stream */
258     ODR print;
259     /** \brief decoding stream (use stream for results) */
260     ODR decode;
261     /** \brief reference ID */
262     Z_ReferenceId *referenceId;
263     /** \brief peer address of client */
264     char *peer_name;
265
266     /** \brief character set and language negotiation
267
268     see include/yaz/z-charneg.h
269     */
270     Z_CharSetandLanguageNegotiation *charneg_request;
271
272     /** \brief character negotiation response */
273     Z_External *charneg_response;
274
275     /** \brief character set (encoding) for query terms
276
277     This is NULL by default. It should be set to the native character
278     set that the backend assumes for query terms */
279     char *query_charset;
280
281     /** \brief whehter query_charset also applies to recors
282
283     Is 0 (No) by default. Set to 1 (yes) if records is in the same
284     character set as queries. If in doubt, use 0 (No).
285     */
286     int records_in_same_charset;
287
288     char *implementation_id;
289     char *implementation_name;
290     char *implementation_version;
291
292     /** \brief Z39.50 sort handler */
293     int (*bend_sort)(void *handle, bend_sort_rr *rr);
294     /** \brief SRU/Z39.50 search handler */
295     int (*bend_search)(void *handle, bend_search_rr *rr);
296     /** \brief SRU/Z39.50 fetch handler */
297     int (*bend_fetch)(void *handle, bend_fetch_rr *rr);
298     /** \brief SRU/Z39.50 present handler */
299     int (*bend_present)(void *handle, bend_present_rr *rr);
300     /** \brief Z39.50 extended services handler */
301     int (*bend_esrequest) (void *handle, bend_esrequest_rr *rr);
302     /** \brief Z39.50 delete result set handler */
303     int (*bend_delete)(void *handle, bend_delete_rr *rr);
304     /** \brief Z39.50 scan handler */
305     int (*bend_scan)(void *handle, bend_scan_rr *rr);
306     /** \brief Z39.50 segment facility handler */
307     int (*bend_segment)(void *handle, bend_segment_rr *rr);
308     /** \brief SRU explain handler */
309     int (*bend_explain)(void *handle, bend_explain_rr *rr);
310     /** \brief SRU scan handler */
311     int (*bend_srw_scan)(void *handle, bend_scan_rr *rr);
312     /** \brief SRU record update handler */
313     int (*bend_srw_update)(void *handle, bend_update_rr *rr);
314
315     /** \brief whether named result sets are supported (0=disable, 1=enable) */
316     int named_result_sets;
317 } bend_initrequest;
318
319 /** \brief result for init handler (must be filled by handler) */
320 typedef struct bend_initresult
321 {
322     int errcode;               /* 0==OK */
323     char *errstring;           /* system error string or NULL */
324     void *handle;              /* private handle to the backend module */
325 } bend_initresult;
326
327 #define BEND_NAME_MAX 1024
328
329 /** \brief control block for server */
330 typedef struct statserv_options_block
331 {
332     int dynamic;                  /**< fork on incoming requests */
333     int threads;                  /**< use threads */
334     int one_shot;                 /**< one session then exit(1) */
335     char apdufile[BEND_NAME_MAX]; /**< file for pretty-printed PDUs */
336     char logfile[BEND_NAME_MAX];  /**< file for diagnostic output */
337     enum oid_proto default_proto; /**< PROTO_SR or PROTO_Z3950 */
338     int idle_timeout;             /**< how many minutes to wait before closing */
339     int maxrecordsize;            /**< maximum value for negotiation */
340     char configname[BEND_NAME_MAX]; /**< given to the backend in bend_init */
341     char setuid[BEND_NAME_MAX];   /**< setuid to this user after binding */
342     void (*bend_start)(struct statserv_options_block *p);
343     void (*bend_stop)(struct statserv_options_block *p);
344     int (*options_func)(int argc, char **argv);
345     int (*check_ip)(void *cd, const char *addr, int len, int type);
346     char daemon_name[BEND_NAME_MAX];
347     int inetd;                    /**< Do we use the inet deamon or not */
348
349     void *handle;                 /**< Handle */
350     bend_initresult *(*bend_init)(bend_initrequest *r);
351     void (*bend_close)(void *handle);
352 #ifdef WIN32
353     /* We only have these members for the windows version */
354     /* They seemed a bit large to have them there in general */
355     char service_name[BEND_NAME_MAX];/**< NT Service Name */
356     char app_name[BEND_NAME_MAX];  /**< Application Name */
357     char service_dependencies[BEND_NAME_MAX];
358     char service_display_name[BEND_NAME_MAX];
359 #endif /* WIN32 */
360     char pid_fname[BEND_NAME_MAX]; /**< pid fname */
361     int background;                /**< auto daemon */
362     char cert_fname[BEND_NAME_MAX];/**< SSL certificate fname */
363     char xml_config[BEND_NAME_MAX];/**< XML config filename */
364     int keepalive;                 /**< keep alive if HTTP 1.1 (default: 1) */
365 } statserv_options_block;
366
367 YAZ_EXPORT int statserv_main(
368     int argc, char **argv,
369     bend_initresult *(*bend_init)(bend_initrequest *r),
370     void (*bend_close)(void *handle));
371
372 YAZ_EXPORT statserv_options_block *statserv_getcontrol(void);
373 YAZ_EXPORT void statserv_setcontrol(statserv_options_block *block);
374 YAZ_EXPORT int check_ip_tcpd(void *cd, const char *addr, int len, int type);
375
376 YAZ_EXPORT int bend_assoc_is_alive(bend_association assoc);
377
378 YAZ_END_CDECL
379
380 #endif
381 /*
382  * Local variables:
383  * c-basic-offset: 4
384  * c-file-style: "Stroustrup"
385  * indent-tabs-mode: nil
386  * End:
387  * vim: shiftwidth=4 tabstop=8 expandtab
388  */
389