// Note: Some things in this structure will eventually move to configuration
struct parameters global_parameters =
{
- "",
- "",
- "",
- 0,
0, // dump_records
0, // debug_mode
30, // operations timeout
- "81",
- "Index Data PazPar2",
- VERSION,
60, // session timeout
100,
- MAX_CHUNK,
- 0,
- 0,
180, // Z39.50 session timeout
15 // Connect timeout
};
static void insert_settings_parameters(struct session_database *sdb,
struct session *se, char **parms)
{
- struct conf_service *service = global_parameters.server->service;
+ struct conf_service *service = se->service;
int i;
int nparms = 0;
int offset = 0;
int setting;
if (md->setting == Metadata_setting_parameter &&
- (setting = settings_offset(md->name)) > 0)
+ (setting = settings_offset(service, md->name)) > 0)
{
const char *val = session_setting_oneval(sdb, setting);
if (val && nparms < MAX_XSLT_ARGS)
}
// Add static values from session database settings if applicable
-static void insert_settings_values(struct session_database *sdb, xmlDoc *doc)
+static void insert_settings_values(struct session_database *sdb, xmlDoc *doc,
+ struct conf_service *service)
{
- struct conf_service *service = global_parameters.server->service;
int i;
for (i = 0; i < service->num_metadata; i++)
int offset;
if (md->setting == Metadata_setting_postproc &&
- (offset = settings_offset(md->name)) > 0)
+ (offset = settings_offset(service, md->name)) > 0)
{
const char *val = session_setting_oneval(sdb, offset);
if (val)
rdoc = new;
}
- insert_settings_values(sdb, rdoc);
+ insert_settings_values(sdb, rdoc, se->service);
if (global_parameters.dump_records)
{
{
(*m) = nmem_malloc(se->session_nmem, sizeof(**m));
(*m)->next = 0;
- if (!((*m)->stylesheet = conf_load_stylesheet(stylesheets[i])))
+ if (!((*m)->stylesheet = conf_load_stylesheet(se->service->config,
+ stylesheets[i])))
{
yaz_log(YLOG_FATAL|YLOG_ERRNO, "Unable to load stylesheet: %s",
stylesheets[i]);
}
enum pazpar2_error_code search(struct session *se,
- char *query, char *filter,
+ const char *query, const char *filter,
const char **addinfo)
{
int live_channels = 0;
static void session_init_databases_fun(void *context, struct database *db)
{
struct session *se = (struct session *) context;
+ struct conf_service *service = se->service;
struct session_database *new = nmem_malloc(se->session_nmem, sizeof(*new));
- int num = settings_num();
+ int num = settings_num(service);
int i;
new->database = db;
void session_init_databases(struct session *se)
{
se->databases = 0;
- predef_grep_databases(se, 0, session_init_databases_fun);
+ predef_grep_databases(se, se->service, 0, session_init_databases_fun);
}
// Probably session_init_databases_fun should be refactored instead of
static struct session_database *load_session_database(struct session *se,
char *id)
{
- struct database *db = find_database(id, 0);
+ struct database *db = find_database(id, 0, se->service);
+
+ resolve_database(db);
session_init_databases_fun((void*) se, db);
// New sdb is head of se->databases list
char *value)
{
struct session_database *sdb = find_session_database(se, dbname);
+ struct conf_service *service = se->service;
struct setting *new = nmem_malloc(se->session_nmem, sizeof(*new));
- int offset = settings_offset_cprefix(setting);
+ int offset = settings_offset_cprefix(service, setting);
if (offset < 0)
{
wrbuf_destroy(s->wrbuf);
}
-struct session *new_session(NMEM nmem)
+struct session *new_session(NMEM nmem, struct conf_service *service)
{
int i;
struct session *session = nmem_malloc(nmem, sizeof(*session));
yaz_log(YLOG_DEBUG, "New Pazpar2 session");
-
+
+ session->service = service;
session->relevance = 0;
session->total_hits = 0;
session->total_records = 0;
}
#endif
-struct record_cluster *show_single(struct session *s, const char *id)
+struct record_cluster *show_single(struct session *s, const char *id,
+ struct record_cluster **prev_r,
+ struct record_cluster **next_r)
{
struct record_cluster *r;
reclist_rewind(s->reclist);
+ *prev_r = 0;
+ *next_r = 0;
while ((r = reclist_read_record(s->reclist)))
+ {
if (!strcmp(r->recid, id))
+ {
+ *next_r = reclist_read_record(s->reclist);
return r;
+ }
+ *prev_r = r;
+ }
return 0;
}
stat->num_clients = count;
}
-int start_http_listener(void)
-{
- char hp[128] = "";
- struct conf_server *ser = global_parameters.server;
-
- if (*global_parameters.listener_override)
- strcpy(hp, global_parameters.listener_override);
- else
- {
- strcpy(hp, ser->host ? ser->host : "");
- if (ser->port)
- {
- if (*hp)
- strcat(hp, ":");
- sprintf(hp + strlen(hp), "%d", ser->port);
- }
- }
- return http_init(hp);
-}
-
-void start_proxy(void)
-{
- char hp[128] = "";
- struct conf_server *ser = global_parameters.server;
-
- if (*global_parameters.proxy_override)
- strcpy(hp, global_parameters.proxy_override);
- else if (ser->proxy_host || ser->proxy_port)
- {
- strcpy(hp, ser->proxy_host ? ser->proxy_host : "");
- if (ser->proxy_port)
- {
- if (*hp)
- strcat(hp, ":");
- sprintf(hp + strlen(hp), "%d", ser->proxy_port);
- }
- }
- else
- return;
-
- http_set_proxyaddr(hp, ser->myurl ? ser->myurl : "");
-}
-
// Master list of connections we're handling events to
-static IOCHAN channel_list = 0;
+static IOCHAN channel_list = 0; /* thread pr */
+
void pazpar2_add_channel(IOCHAN chan)
{
chan->next = channel_list;
return rec_md;
}
-const char *get_mergekey(xmlDoc *doc, struct client *cl, int record_no,
- struct conf_service *service, NMEM nmem)
+static const char *get_mergekey(xmlDoc *doc, struct client *cl, int record_no,
+ struct conf_service *service, NMEM nmem)
{
char *mergekey_norm = 0;
xmlNode *root = xmlDocGetRootElement(doc);
const char *norm_str;
pp2_relevance_token_t prt =
pp2_relevance_tokenize(
- global_parameters.server->mergekey_pct,
+ service->mergekey_pct,
(const char *) mergekey);
while ((norm_str = pp2_relevance_token_next(prt)))
const char *norm_str;
pp2_relevance_token_t prt =
pp2_relevance_tokenize(
- global_parameters.server->mergekey_pct,
+ service->mergekey_pct,
(const char *) value);
while ((norm_str = pp2_relevance_token_next(prt)))
const char *mergekey_norm;
xmlChar *type = 0;
xmlChar *value = 0;
- struct conf_service *service = global_parameters.server->service;
+ struct conf_service *service = se->service;
if (!xdoc)
return 0;
record_no);
cluster = reclist_insert(se->reclist,
- global_parameters.server->service,
+ service,
record, (char *) mergekey_norm,
&se->total_merged);
if (global_parameters.dump_records)
sizeof(union data_types));
prt = pp2_relevance_tokenize(
- global_parameters.server->sort_pct,
+ service->sort_pct,
rec_md->data.text.disp);
pp2_relevance_token_next(prt);