http_close_server();
}
-static struct conf_service *locate_service(const char *service_name)
-{
- return global_parameters.server->service;
-}
-
static void cmd_init(struct http_channel *c)
{
unsigned int sesid;
char buf[1024];
const char *clear = http_argbyname(c->request, "clear");
const char *service_name = http_argbyname(c->request, "service");
- struct http_session *s = http_session_create(locate_service(service_name));
+ struct conf_service *service = locate_service(service_name);
+ struct http_session *s = http_session_create(service);
struct http_response *rs = c->response;
+ if (!service)
+ {
+ error(rs, PAZPAR2_MALFORMED_PARAMETER_VALUE, "service");
+ return;
+ }
+
yaz_log(YLOG_DEBUG, "HTTP Session init");
if (!clear || *clear == '0')
session_init_databases(s->psession);
}
-struct conf_service * conf_service_create(int num_metadata, int num_sortkeys)
+struct conf_service * conf_service_create(int num_metadata, int num_sortkeys,
+ const char *service_id)
{
struct conf_service * service = 0;
NMEM nmem = nmem_create();
//assert(nmem);
service = nmem_malloc(nmem, sizeof(struct conf_service));
+ service->nmem = nmem;
+ service->next = 0;
+ service->id = service_id ? nmem_strdup(nmem, service_id) : 0;
service->num_metadata = num_metadata;
service->metadata = 0;
if (service->num_metadata)
service->sortkeys
= nmem_malloc(nmem,
sizeof(struct conf_sortkey) * service->num_sortkeys);
-
- service->nmem = nmem;
service->dictionary = 0;
return service;
}
/* Code to parse configuration file */
/* ==================================================== */
-static struct conf_service *parse_service(xmlNode *node)
+static struct conf_service *parse_service(xmlNode *node, const char *service_id)
{
xmlNode *n;
int md_node = 0;
xmlFree(sortkey);
}
- service = conf_service_create(num_metadata, num_sortkeys);
+ service = conf_service_create(num_metadata, num_sortkeys, service_id);
for (n = node->children; n; n = n->next)
{
}
else if (!strcmp((const char *) n->name, "service"))
{
- struct conf_service *s = parse_service(n);
- if (!s)
+ const char *service_id = (const char *)
+ xmlGetProp(n, (xmlChar *) "id");
+
+ struct conf_service **sp = &server->service;
+ for (; *sp; sp = &(*sp)->next)
+ if ((*sp)->id && service_id &&
+ 0 == strcmp((*sp)->id, service_id))
+ {
+ yaz_log(YLOG_FATAL, "Duplicate service: %s", service_id);
+ break;
+ }
+ else if (!(*sp)->id && !service_id)
+ {
+ yaz_log(YLOG_FATAL, "Duplicate unnamed service");
+ break;
+ }
+
+ if (*sp) /* service already exist */
return 0;
- server->service = s;
+ else
+ {
+ struct conf_service *s = parse_service(n, service_id);
+ if (s)
+ *sp = s;
+ }
}
else
{
return r;
}
+struct conf_service *locate_service(const char *service_id)
+{
+ struct conf_service *s = config->servers->service;
+ for (; s; s = s->next)
+ if (s->id && service_id && 0 == strcmp(s->id, service_id))
+ return s;
+ else if (!s->id && !service_id)
+ return s;
+ return 0;
+}
+
+
static struct conf_config *parse_config(xmlNode *root)
{
NMEM nmem = nmem_create();
int num_sortkeys;
struct conf_sortkey *sortkeys;
struct setting_dictionary *dictionary;
+ struct conf_service *next;
+ char *id;
NMEM nmem;
};
-struct conf_service * conf_service_create(int num_metadata, int num_sortkeys);
+struct conf_service * conf_service_create(int num_metadata, int num_sortkeys,
+ const char *service_id);
struct conf_metadata* conf_service_add_metadata(struct conf_service *service,
int field_id,
int conf_service_sortkey_field_id(struct conf_service *service, const char * name);
+struct conf_service *locate_service(const char *service_id);
+
struct conf_server
{
char *host;