c03b45983daefaa623ff7d8c8f3e55936eee8f9a
[pazpar2-moved-to-github.git] / src / config.h
1 /* $Id: config.h,v 1.28 2007-10-31 05:29:08 quinn Exp $
2    Copyright (c) 2006-2007, Index Data.
3
4 This file is part of Pazpar2.
5
6 Pazpar2 is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 2, or (at your option) any later
9 version.
10
11 Pazpar2 is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with Pazpar2; see the file LICENSE.  If not, write to the
18 Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
19 02111-1307, USA.
20  */
21
22 #ifndef CONFIG_H
23 #define CONFIG_H
24
25 #include <libxslt/xslt.h>
26 #include <libxslt/transform.h>
27 #include <libxslt/xsltutils.h>
28
29 #include <yaz/nmem.h>
30 #include "charsets.h"
31
32 enum conf_metadata_type {
33     Metadata_type_generic,    // Generic text field
34     Metadata_type_number,     // A number
35     Metadata_type_year,        // A number
36     Metadata_type_date        // A number
37 };
38
39 enum conf_metadata_merge {
40     Metadata_merge_no,        // Don't merge
41     Metadata_merge_unique,    // Include unique elements in merged block
42     Metadata_merge_longest,   // Include the longest (strlen) value
43     Metadata_merge_range,     // Store value as a range of lowest-highest
44     Metadata_merge_all        // Just include all elements found
45 };
46
47 enum conf_sortkey_type {
48     Metadata_sortkey_relevance,
49     Metadata_sortkey_numeric,       // Standard numerical sorting
50     Metadata_sortkey_skiparticle,   // Skip leading article when sorting
51     Metadata_sortkey_string         // Flat string
52 };
53
54 // This controls the ability to insert 'static' values from settings into retrieval recs
55 enum conf_setting_type {
56     Metadata_setting_no,
57     Metadata_setting_postproc,      // Insert setting value into normalized record
58     Metadata_setting_parameter      // Expose value to normalization stylesheets
59 };
60
61 // Describes known metadata elements and how they are to be manipulated
62 // An array of these structure provides a 'map' against which
63 // discovered metadata elements are matched. It also governs storage,
64 // to minimize number of cycles needed at various tages of processing
65 struct conf_metadata 
66 {
67     char *name;  // The field name. Output by normalization stylesheet
68     int brief;   // Is this element to be returned in the brief format?
69     int termlist;// Is this field to be treated as a termlist for browsing?
70     int rank;    // Rank factor. 0 means don't use this field for ranking, 
71                  // 1 is default
72                  // values >1  give additional significance to a field
73     int sortkey_offset; // -1 if it's not a sortkey, otherwise index
74                         // into service/record_cluster->sortkey array
75     enum conf_metadata_type type;
76     enum conf_metadata_merge merge;
77     enum conf_setting_type setting; // Value is to be taken from session/db settings?
78 };
79
80
81
82 struct conf_metadata * conf_metadata_assign(NMEM nmem, 
83                                             struct conf_metadata * metadata,
84                                             const char *name,
85                                             enum conf_metadata_type type,
86                                             enum conf_metadata_merge merge,
87                                             enum conf_setting_type setting,
88                                             int brief,
89                                             int termlist,
90                                             int rank,
91                                             int sortkey_offset);
92
93
94
95 // Controls sorting
96 struct conf_sortkey
97 {
98     char *name;
99     enum conf_sortkey_type type;
100 };
101
102 struct conf_sortkey * conf_sortkey_assign(NMEM nmem, 
103                                             struct conf_sortkey * sortkey,
104                                             const char *name,
105                                             enum conf_sortkey_type type);
106
107
108
109 // It is conceivable that there will eventually be several 'services'
110 // offered from one server, with separate configuration -- possibly
111 // more than one services associated with the same port. For now,
112 // however, only a single service is possible.
113 struct conf_service
114 {
115     int num_metadata;
116     struct conf_metadata *metadata;
117     int num_sortkeys;
118     struct conf_sortkey *sortkeys;
119
120 };
121
122 struct conf_service * conf_service_create(NMEM nmem, 
123                                           int num_metadata, int num_sortkeys);
124
125
126 struct conf_metadata* conf_service_add_metadata(NMEM nmem, 
127                                                 struct conf_service *service,
128                                                 int field_id,
129                                                 const char *name,
130                                                 enum conf_metadata_type type,
131                                                 enum conf_metadata_merge merge,
132                                                 enum conf_setting_type setting,
133                                                 int brief,
134                                                 int termlist,
135                                                 int rank,
136                                                 int sortkey_offset);
137
138 struct conf_sortkey * conf_service_add_sortkey(NMEM nmem,
139                                                struct conf_service *service,
140                                                int field_id,
141                                                const char *name,
142                                                enum conf_sortkey_type type);
143
144
145 int conf_service_metadata_field_id(struct conf_service *service, const char * name);
146
147 int conf_service_sortkey_field_id(struct conf_service *service, const char * name);
148
149
150 struct conf_server
151 {
152     char *host;
153     int port;
154     char *proxy_host;
155     int proxy_port;
156     char *myurl;
157     char *settings;
158
159     pp2_charset_t relevance_pct;
160     pp2_charset_t sort_pct;
161     pp2_charset_t mergekey_pct;
162
163     struct conf_service *service;
164     struct conf_server *next;
165 };
166
167 struct conf_targetprofiles
168 {
169     enum {
170         Targetprofiles_local
171     } type;
172     char *src;
173 };
174
175 struct conf_config
176 {
177     struct conf_server *servers;
178     struct conf_targetprofiles *targetprofiles;
179 };
180
181 #ifndef CONFIG_NOEXTERNS
182
183 extern struct conf_config *config;
184
185 #endif
186
187 int read_config(const char *fname);
188 xsltStylesheet *conf_load_stylesheet(const char *fname);
189
190 #endif
191
192 /*
193  * Local variables:
194  * c-basic-offset: 4
195  * indent-tabs-mode: nil
196  * End:
197  * vim: shiftwidth=4 tabstop=8 expandtab
198  */