X-Git-Url: http://lists.indexdata.com/cgi-bin?a=blobdiff_plain;f=src%2Flogic.c;h=3da6ca3390c4ee708be824023aad31f34733e68e;hb=f7247294488509fca6dc8e0d32f63cd8ae51b555;hp=e2155dd9211c1f661df19053b2a25f05728afa97;hpb=d5be779678ef159bf7f18558cf08f5a0643425a0;p=pazpar2-moved-to-github.git diff --git a/src/logic.c b/src/logic.c index e2155dd..3da6ca3 100644 --- a/src/logic.c +++ b/src/logic.c @@ -68,6 +68,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "client.h" #include "settings.h" #include "normalize7bit.h" +#include "marcmap.h" #define TERMLIST_HIGH_SCORE 25 @@ -78,11 +79,7 @@ struct parameters global_parameters = { 0, // dump_records 0, // debug_mode - 30, // operations timeout - 60, // session timeout 100, - 180, // Z39.50 session timeout - 15 // Connect timeout }; static void log_xml_doc(xmlDoc *doc) @@ -261,8 +258,17 @@ xmlDoc *normalize_record(struct session_database *sdb, struct session *se, insert_settings_parameters(sdb, se, parms); - new = xsltApplyStylesheet(m->stylesheet, rdoc, (const char **) parms); - root= xmlDocGetRootElement(new); + if (m->stylesheet) + { + new = xsltApplyStylesheet(m->stylesheet, rdoc, (const char **) parms); + } + else if (m->marcmap) + { + new = marcmap_apply(m->marcmap, rdoc); + } + + root = xmlDocGetRootElement(new); + if (!new || !root || !(root->children)) { yaz_log(YLOG_WARN, "XSLT transformation failed from %s", @@ -346,12 +352,30 @@ static int prepare_map(struct session *se, struct session_database *sdb) { (*m) = nmem_malloc(se->session_nmem, sizeof(**m)); (*m)->next = 0; - if (!((*m)->stylesheet = conf_load_stylesheet(stylesheets[i]))) + + // XSLT + if (!strcmp(&stylesheets[i][strlen(stylesheets[i])-4], ".xsl")) + { + (*m)->marcmap = NULL; + if (!((*m)->stylesheet = conf_load_stylesheet(se->service->config, stylesheets[i]))) + { + yaz_log(YLOG_FATAL|YLOG_ERRNO, "Unable to load stylesheet: %s", + stylesheets[i]); + return -1; + } + } + // marcmap + else if (!strcmp(&stylesheets[i][strlen(stylesheets[i])-5], ".mmap")) { - yaz_log(YLOG_FATAL|YLOG_ERRNO, "Unable to load stylesheet: %s", - stylesheets[i]); - return -1; + (*m)->stylesheet = NULL; + if (!((*m)->marcmap = marcmap_load(stylesheets[i], se->session_nmem))) + { + yaz_log(YLOG_FATAL|YLOG_ERRNO, "Unable to load marcmap: %s", + stylesheets[i]); + return -1; + } } + m = &(*m)->next; } } @@ -501,7 +525,7 @@ static struct database_criterion *parse_filter(NMEM m, const char *buf) } 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; @@ -542,7 +566,8 @@ enum pazpar2_error_code search(struct session *se, else { no_working++; - if (client_prep_connection(cl)) + if (client_prep_connection(cl, se->service->z3950_connect_timeout, + se->service->z3950_session_timeout)) client_start_search(cl); } } @@ -605,6 +630,8 @@ static struct session_database *load_session_database(struct session *se, { 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 return se->databases; @@ -867,54 +894,10 @@ void statistics(struct session *se, struct statistics *stat) stat->num_clients = count; } -int start_http_listener(struct conf_config *conf, - const char *listener_override, - const char *proxy_override) -{ - struct conf_server *ser; - for (ser = conf->servers; ser; ser = ser->next) - { - char hp[128]; - *hp = '\0'; - if (listener_override) - { - strcpy(hp, listener_override); - listener_override = 0; /* only first server is overriden */ - } - else - { - strcpy(hp, ser->host ? ser->host : ""); - if (ser->port) - { - if (*hp) - strcat(hp, ":"); - sprintf(hp + strlen(hp), "%d", ser->port); - } - } - if (http_init(hp, ser)) - return -1; - - *hp = '\0'; - if (proxy_override) - strcpy(hp, 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); - } - } - if (*hp) - http_set_proxyaddr(hp, ser->myurl ? ser->myurl : ""); - } - return 0; -} // 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;