/* This file is part of Pazpar2.
- Copyright (C) 2006-2010 Index Data
+ Copyright (C) 2006-2011 Index Data
Pazpar2 is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
#if HAVE_UNISTD_H
#include <unistd.h>
#endif
+#include "ppmutex.h"
#include "incref.h"
#include "pazpar2_config.h"
#include "settings.h"
int no_threads;
WRBUF confdir;
iochan_man_t iochan_man;
+ database_hosts_t database_hosts;
};
static char *parse_settings(struct conf_config *config,
NMEM nmem, xmlNode *node);
-static struct conf_targetprofiles *parse_targetprofiles(NMEM nmem,
- xmlNode *node);
-
static void conf_metadata_assign(NMEM nmem,
struct conf_metadata * metadata,
const char *name,
service->next = 0;
service->settings = 0;
service->databases = 0;
- service->targetprofiles = 0;
service->server = server;
service->session_timeout = 60; /* default session timeout */
service->z3950_session_timeout = 180;
service->relevance_pct = 0;
service->sort_pct = 0;
service->mergekey_pct = 0;
+ service->facet_pct = 0;
service->id = service_id ? nmem_strdup(nmem, service_id) : 0;
service->num_metadata = num_metadata;
pp2_charset_destroy(service->relevance_pct);
pp2_charset_destroy(service->sort_pct);
pp2_charset_destroy(service->mergekey_pct);
+ pp2_charset_destroy(service->facet_pct);
yaz_mutex_destroy(&service->mutex);
nmem_destroy(service->nmem);
}
}
else if (!strcmp((const char *) n->name, "settings"))
got_settings++;
- else if (!strcmp((const char *) n->name, (const char *) "targetprofiles"))
- {
- if (service->targetprofiles)
- {
- yaz_log(YLOG_FATAL, "Can't repeat targetprofiles");
- return 0;
- }
- if (!(service->targetprofiles =
- parse_targetprofiles(service->nmem, n)))
- return 0;
- }
else if (!strcmp((const char *) n->name, "relevance"))
{
if (service->relevance_pct)
return 0;
}
}
+ else if (!strcmp((const char *) n->name, "facet"))
+ {
+ if (service->mergekey_pct)
+ {
+ yaz_log(YLOG_LOG, "facety may not repeat in service");
+ return 0;
+ }
+ else
+ {
+ service->facet_pct = pp2_charset_create_xml(n);
+ if (!service->mergekey_pct)
+ return 0;
+ }
+ }
else if (!strcmp((const char *) n->name, (const char *) "metadata"))
{
if (parse_metadata(service, n, &md_node, &sk_node))
}
}
- /* use relevance/sort/mergekey from server if not defined
+ /* use relevance/sort/mergekey/facet from server if not defined
for this service.. */
if (!s->relevance_pct)
{
pp2_charset_incref(s->relevance_pct);
}
else
- s->relevance_pct = pp2_charset_create(0);
+ s->relevance_pct = pp2_charset_create_a_to_z();
}
if (!s->sort_pct)
pp2_charset_incref(s->sort_pct);
}
else
- s->sort_pct = pp2_charset_create(0);
+ s->sort_pct = pp2_charset_create_a_to_z();
}
if (!s->mergekey_pct)
pp2_charset_incref(s->mergekey_pct);
}
else
- s->mergekey_pct = pp2_charset_create(0);
+ s->mergekey_pct = pp2_charset_create_a_to_z();
+ }
+
+ if (!s->facet_pct)
+ {
+ if (server->facet_pct)
+ {
+ s->facet_pct = server->facet_pct;
+ pp2_charset_incref(s->facet_pct);
+ }
+ else
+ s->facet_pct = pp2_charset_create(0);
}
}
inherit_server_settings(service);
resolve_databases(service);
assert(service->mutex == 0);
- yaz_mutex_create(&service->mutex);
+ pazpar2_mutex_create(&service->mutex, "conf");
}
return service;
}
server->relevance_pct = 0;
server->sort_pct = 0;
server->mergekey_pct = 0;
+ server->facet_pct = 0;
server->server_settings = 0;
server->http_server = 0;
server->iochan_man = 0;
+ server->database_hosts = 0;
if (server_id)
{
if (!server->mergekey_pct)
return 0;
}
+ else if (!strcmp((const char *) n->name, "facet"))
+ {
+ server->facet_pct = pp2_charset_create_xml(n);
+ if (!server->facet_pct)
+ return 0;
+ }
else if (!strcmp((const char *) n->name, "service"))
{
char *service_id = (char *)
return server;
}
-WRBUF conf_get_fname(struct conf_service *service, const char *fname)
+WRBUF conf_get_fname(struct conf_config *config, const char *fname)
{
- struct conf_config *config = service->server->config;
WRBUF w = wrbuf_alloc();
conf_dir_path(config, w, fname);
return w;
}
-static struct conf_targetprofiles *parse_targetprofiles(NMEM nmem,
- xmlNode *node)
-{
- struct conf_targetprofiles *r = nmem_malloc(nmem, sizeof(*r));
- xmlChar *type = xmlGetProp(node, (xmlChar *) "type");
- xmlChar *src = xmlGetProp(node, (xmlChar *) "src");
-
- memset(r, 0, sizeof(*r));
-
- if (type)
- {
- if (!strcmp((const char *) type, "local"))
- r->type = Targetprofiles_local;
- else
- {
- yaz_log(YLOG_FATAL, "Unknown targetprofile type");
- return 0;
- }
- }
- else
- {
- yaz_log(YLOG_FATAL, "Must specify type for targetprofile");
- return 0;
- }
-
- if (src)
- r->src = nmem_strdup(nmem, (const char *) src);
- else
- {
- yaz_log(YLOG_FATAL, "Must specify src in targetprofile");
- return 0;
- }
- xmlFree(type);
- xmlFree(src);
- return r;
-}
-
struct conf_service *locate_service(struct conf_server *server,
const char *service_id)
{
return s;
}
+void info_services(struct conf_server *server, WRBUF w)
+{
+ struct conf_service *s = server->service;
+ wrbuf_puts(w, " <services>\n");
+ for (; s; s = s->next)
+ {
+ wrbuf_puts(w, " <service");
+ if (s->id)
+ {
+ wrbuf_puts(w, " id=\"");
+ wrbuf_xmlputs(w, s->id);
+ wrbuf_puts(w, "\"");
+ }
+ wrbuf_puts(w, "/>");
+
+ wrbuf_puts(w, "\n");
+ }
+ wrbuf_puts(w, " </services>\n");
+}
static int parse_config(struct conf_config *config, xmlNode *root)
{
pp2_charset_destroy(server->relevance_pct);
pp2_charset_destroy(server->sort_pct);
pp2_charset_destroy(server->mergekey_pct);
+ pp2_charset_destroy(server->facet_pct);
yaz_log(YLOG_LOG, "server_destroy server=%p", server);
http_server_destroy(server->http_server);
}
if (config)
{
struct conf_server *server = config->servers;
+ iochan_man_destroy(&config->iochan_man);
while (server)
{
struct conf_server *s_next = server->next;
server_destroy(server);
server = s_next;
}
+ database_hosts_destroy(&config->database_hosts);
+
wrbuf_destroy(config->confdir);
nmem_destroy(config->nmem);
}
void config_process_events(struct conf_config *conf)
{
struct conf_server *ser;
+
+ conf->database_hosts = database_hosts_create();
for (ser = conf->servers; ser; ser = ser->next)
{
struct conf_service *s = ser->service;
+
+ ser->database_hosts = conf->database_hosts;
+
for (;s ; s = s->next)
{
resolve_databases(s);
assert(s->mutex == 0);
- yaz_mutex_create(&s->mutex);
+ pazpar2_mutex_create(&s->mutex, "service");
}
http_mutex_init(ser);
}
}
int config_start_listeners(struct conf_config *conf,
- const char *listener_override)
+ const char *listener_override,
+ const char *record_fname)
{
struct conf_server *ser;
wrbuf_printf(w, "%d", ser->port);
}
}
- r = http_init(wrbuf_cstr(w), ser);
+ r = http_init(wrbuf_cstr(w), ser, record_fname);
wrbuf_destroy(w);
if (r)
return -1;