X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Flogic.c;h=c3aecbe461734c06ef7df61a498f2cc2d787aa07;hb=5b4ea0cf66dd82c871ed7d69a5801d78789087b2;hp=02a133d33e2a2e7b9632576b2fca20dd30163463;hpb=a6b5e633581cbae0759c3b68faa7a0cd0197f790;p=pazpar2-moved-to-github.git diff --git a/src/logic.c b/src/logic.c index 02a133d..c3aecbe 100644 --- a/src/logic.c +++ b/src/logic.c @@ -76,21 +76,11 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA // 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 }; @@ -196,7 +186,7 @@ xmlDoc *record_to_xml(struct session_database *sdb, const char *rec) 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; @@ -207,7 +197,7 @@ static void insert_settings_parameters(struct session_database *sdb, 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) @@ -229,9 +219,9 @@ static void insert_settings_parameters(struct session_database *sdb, } // 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++) @@ -240,7 +230,7 @@ static void insert_settings_values(struct session_database *sdb, xmlDoc *doc) 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) @@ -287,7 +277,7 @@ xmlDoc *normalize_record(struct session_database *sdb, struct session *se, rdoc = new; } - insert_settings_values(sdb, rdoc); + insert_settings_values(sdb, rdoc, se->service); if (global_parameters.dump_records) { @@ -356,7 +346,8 @@ 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]))) + if (!((*m)->stylesheet = conf_load_stylesheet(se->service->config, + stylesheets[i]))) { yaz_log(YLOG_FATAL|YLOG_ERRNO, "Unable to load stylesheet: %s", stylesheets[i]); @@ -511,7 +502,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; @@ -532,7 +523,7 @@ enum pazpar2_error_code search(struct session *se, live_channels = select_targets(se, criteria); if (live_channels) { - int maxrecs = live_channels * global_parameters.toget; + int maxrecs = live_channels * global_parameters.toget; // This is buggy!!! se->reclist = reclist_create(se->nmem, maxrecs); se->expected_maxrecs = maxrecs; } @@ -570,8 +561,9 @@ enum pazpar2_error_code search(struct session *se, 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; @@ -604,7 +596,7 @@ static void session_database_destroy(struct session_database *sdb) 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 @@ -612,7 +604,7 @@ void session_init_databases(struct session *se) 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); session_init_databases_fun((void*) se, db); // New sdb is head of se->databases list @@ -636,8 +628,9 @@ void session_apply_setting(struct session *se, char *dbname, char *setting, 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) { @@ -686,13 +679,14 @@ void destroy_session(struct session *s) 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; @@ -765,14 +759,24 @@ void report_nmem_stats(void) } #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; } @@ -864,52 +868,10 @@ void statistics(struct session *se, struct statistics *stat) 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; @@ -951,8 +913,8 @@ static struct record_metadata *record_metadata_init( 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); @@ -966,7 +928,7 @@ const char *get_mergekey(xmlDoc *doc, struct client *cl, int record_no, 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))) @@ -1010,7 +972,7 @@ const char *get_mergekey(xmlDoc *doc, struct client *cl, int record_no, 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))) @@ -1063,7 +1025,7 @@ struct record *ingest_record(struct client *cl, const char *rec, 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; @@ -1082,7 +1044,7 @@ struct record *ingest_record(struct client *cl, const char *rec, record_no); cluster = reclist_insert(se->reclist, - global_parameters.server->service, + service, record, (char *) mergekey_norm, &se->total_merged); if (global_parameters.dump_records) @@ -1196,7 +1158,7 @@ struct record *ingest_record(struct client *cl, const char *rec, 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);