X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fpazpar2_config.c;h=1dfb379fd1c8702eb7bb35a5b10d0c4620bf3832;hb=a0bb88120d5fc86e5e106fe3309a344c08a96f20;hp=49a73d7fcf92c2b0fa1fbc0ce2052e41f660f5f6;hpb=e413b0a94252b858ec346ca98155e7ab61660802;p=pazpar2-moved-to-github.git diff --git a/src/pazpar2_config.c b/src/pazpar2_config.c index 49a73d7..1dfb379 100644 --- a/src/pazpar2_config.c +++ b/src/pazpar2_config.c @@ -150,9 +150,7 @@ struct conf_service *service_init(struct conf_server *server, service->sortkeys = nmem_malloc(nmem, sizeof(struct conf_sortkey) * service->num_sortkeys); - service->xml_node = 0; - return service; } @@ -273,8 +271,6 @@ void service_destroy(struct conf_service *service) if (!pazpar2_decref(&service->ref_count, service->mutex)) { service_xslt_destroy(service); - if (service->xml_node) - xmlFreeNode(service->xml_node); pp2_charset_fact_destroy(service->charsets); ccl_qual_rm(&service->ccl_bibset); yaz_mutex_destroy(&service->mutex); @@ -746,7 +742,14 @@ static struct conf_service *service_create_static(struct conf_server *server, } } } - service->xml_node = xmlCopyNode(node, 1); + + { + xmlBufferPtr buf = xmlBufferCreate(); + xmlNodeDump(buf, node->doc, node, 0, 0); + service->xml_node = + nmem_strdupn(service->nmem, (const char *) buf->content, buf->use); + xmlBufferFree(buf); + } return service; } @@ -983,9 +986,147 @@ struct conf_service *locate_service(struct conf_server *server, return s; } +static void info_service_metadata(struct conf_service *service, WRBUF w) +{ + int i; + struct conf_metadata *md; + + if (service->num_metadata) + { + for (i = 0; i < service->num_metadata; i++) + { + md = &(service->metadata[i]); + wrbuf_puts(w, " name) { + wrbuf_puts(w, " name=\""); + wrbuf_xmlputs(w, md->name); + wrbuf_puts(w, "\""); + } + if (md->brief) { + wrbuf_puts(w, " brief=\"yes\""); + } + if (md->termlist) { + wrbuf_puts(w, " termlist=\"yes\""); + } + if (md->rank) { + wrbuf_puts(w, " rank=\""); + wrbuf_xmlputs(w, md->rank); + wrbuf_puts(w, "\""); + } + if (md->sortkey_offset > 0) { + wrbuf_puts(w, " sortkey=\""); + switch (service->sortkeys[md->sortkey_offset].type) { + case Metadata_sortkey_relevance: + wrbuf_puts(w, "relevance"); + break; + case Metadata_sortkey_numeric: + wrbuf_puts(w, "numeric"); + break; + case Metadata_sortkey_skiparticle: + wrbuf_puts(w, "skiparticle"); + break; + case Metadata_sortkey_string: + wrbuf_puts(w, "string"); + break; + case Metadata_sortkey_position: + wrbuf_puts(w, "position"); + break; + } + wrbuf_puts(w, "\""); + } + + switch (md->type) { + case Metadata_type_generic: + break; + case Metadata_type_year: + wrbuf_puts(w, " type=\"year\""); + break; + case Metadata_type_date: + wrbuf_puts(w, " type=\"date\""); + break; + } + + switch (md->merge) { + case Metadata_merge_no: + break; + case Metadata_merge_unique: + wrbuf_puts(w, " merge=\"unique\""); + break; + case Metadata_merge_longest: + wrbuf_puts(w, " merge=\"longest\""); + break; + case Metadata_merge_range: + wrbuf_puts(w, " merge=\"range\""); + break; + case Metadata_merge_all: + wrbuf_puts(w, " merge=\"all\""); + break; + case Metadata_merge_first: + wrbuf_puts(w, " merge=\"first\""); + break; + } + + switch (md->mergekey) { + case Metadata_mergekey_no: + break; + case Metadata_mergekey_optional: + wrbuf_puts(w, " mergekey=\"optional\""); + break; + case Metadata_mergekey_required: + wrbuf_puts(w, " mergekey=\"required\""); + break; + } + wrbuf_puts(w, " />\n"); + } + } +} + +static void info_service_databases(struct conf_service *service, WRBUF w) +{ + struct database *db; + struct setting *s; + int i; + + if (service->databases) + { + wrbuf_puts(w, " \n"); + for(db = service->databases; db; db = db->next) + { + wrbuf_puts(w, " id) { + wrbuf_puts(w, " id=\""); + wrbuf_printf(w, "%s", db->id); + wrbuf_puts(w, "\""); + } + wrbuf_puts(w, ">\n"); + for (i = 0; i < db->num_settings; i++) + { + s = db->settings[i]; + while (s != NULL) { + wrbuf_puts(w, " name); + wrbuf_puts(w, "\""); + wrbuf_puts(w, " value=\""); + wrbuf_xmlputs(w, s->value); + wrbuf_puts(w, "\""); + wrbuf_puts(w, " />\n"); + s = s->next; + } + } + wrbuf_puts(w, " \n"); + } + + wrbuf_puts(w, " \n"); + } +} + void info_services(struct conf_server *server, WRBUF w) { struct conf_service *s = server->service; + int i; + struct setting *S; + wrbuf_puts(w, " \n"); for (; s; s = s->next) { @@ -996,7 +1137,35 @@ void info_services(struct conf_server *server, WRBUF w) wrbuf_xmlputs(w, s->id); wrbuf_puts(w, "\""); } - wrbuf_puts(w, "/>"); + wrbuf_puts(w, ">\n"); + if (s->settings) + { + for (i=0; isettings->num_settings; i++) + { + S = s->settings->settings[i]; + while (S != NULL) { + wrbuf_puts(w, " name); + wrbuf_puts(w, "\""); + wrbuf_puts(w, " value=\""); + wrbuf_xmlputs(w, S->value); + wrbuf_puts(w, "\""); + if (S->target) { + wrbuf_puts(w, " target=\""); + wrbuf_xmlputs(w, S->target); + wrbuf_puts(w, "\""); + } + + wrbuf_puts(w, " />\n"); + + S = S->next; + } + } + } + info_service_metadata(s, w); + info_service_databases(s, w); + wrbuf_puts(w, " "); wrbuf_puts(w, "\n"); }