X-Git-Url: http://lists.indexdata.com/cgi-bin?a=blobdiff_plain;f=src%2Flogic.c;h=3cc1a2380d0baf382bdf43706c4938da0febc2b8;hb=b9e747558f5ecc8403ce00c810c139417d8933cc;hp=c581f2d9f1b43591de8881313db286ba8b64abab;hpb=8a04d0256b795bd3c13764d8ba036a72eec5a6f0;p=pazpar2-moved-to-github.git diff --git a/src/logic.c b/src/logic.c index c581f2d..3cc1a23 100644 --- a/src/logic.c +++ b/src/logic.c @@ -1,4 +1,4 @@ -/* $Id: logic.c,v 1.9 2007-04-18 19:45:09 quinn Exp $ +/* $Id: logic.c,v 1.12 2007-04-20 04:32:33 quinn Exp $ Copyright (c) 2006-2007, Index Data. This file is part of Pazpar2. @@ -74,8 +74,6 @@ static int client_prep_connection(struct client *cl); static void ingest_records(struct client *cl, Z_Records *r); void session_alert_watch(struct session *s, int what); -IOCHAN channel_list = 0; // Master list of connections we're handling events to - static struct connection *connection_freelist = 0; static struct client *client_freelist = 0; @@ -1073,7 +1071,7 @@ static void handler(IOCHAN i, int event) if (cl->state == Client_Idle) { - if (cl->requestid != se->requestid && *se->query) { + if (cl->requestid != se->requestid && cl->pquery) { send_search(i); } else if (cl->hits > 0 && cl->records < global_parameters.toget && @@ -1192,8 +1190,7 @@ static struct connection *connection_create(struct client *cl) new->iochan = iochan_create(cs_fileno(link), handler, 0); iochan_setdata(new->iochan, new); - new->iochan->next = channel_list; - channel_list = new->iochan; + pazpar2_add_channel(new->iochan); return new; } @@ -1251,14 +1248,43 @@ static int client_prep_connection(struct client *cl) return 0; } +// Initialize CCL map for a target +static CCL_bibset prepare_cclmap(struct client *cl) +{ + struct session_database *sdb = cl->database; + struct setting *s; + CCL_bibset res; + + if (!sdb->settings) + return 0; + res = ccl_qual_mk(); + for (s = sdb->settings[PZ_CCLMAP]; s; s = s->next) + { + char *p = strchr(s->name + 3, ':'); + if (!p) + { + yaz_log(YLOG_WARN, "Malformed cclmap name: %s", s->name); + ccl_qual_rm(&res); + return 0; + } + p++; + ccl_qual_fitem(res, s->value, p); + } + return res; +} + // Parse the query given the settings specific to this client -static int client_parse_query(struct client *cl) +static int client_parse_query(struct client *cl, const char *query) { struct session *se = cl->session; struct ccl_rpn_node *cn; int cerror, cpos; + CCL_bibset ccl_map = prepare_cclmap(cl); - cn = ccl_find_str(cl->database->database->ccl_map, se->query, &cerror, &cpos); + if (!ccl_map) + return -1; + cn = ccl_find_str(ccl_map, query, &cerror, &cpos); + ccl_qual_rm(&ccl_map); if (!cn) { cl->state = Client_Error; @@ -1430,7 +1456,6 @@ char *search(struct session *se, char *query, char *filter) nmem_reset(se->nmem); criteria = parse_filter(se->nmem, filter); - strcpy(se->query, query); se->requestid++; live_channels = select_targets(se, criteria); if (live_channels) @@ -1447,7 +1472,7 @@ char *search(struct session *se, char *query, char *filter) se->relevance = 0; for (cl = se->clients; cl; cl = cl->next) - if (client_parse_query(cl) < 0) // Query must parse for all targets + if (client_parse_query(cl, query) < 0) // Query must parse for all targets return "QUERY"; for (cl = se->clients; cl; cl = cl->next) client_prep_connection(cl); @@ -1529,7 +1554,6 @@ struct session *new_session(NMEM nmem) session->requestid = -1; session->clients = 0; session->expected_maxrecs = 0; - session->query[0] = '\0'; session->session_nmem = nmem; session->nmem = nmem_create(); session->wrbuf = wrbuf_alloc(); @@ -1755,7 +1779,18 @@ void start_zproxy(void) return; } +// Master list of connections we're handling events to +static IOCHAN channel_list = 0; +void pazpar2_add_channel(IOCHAN chan) +{ + chan->next = channel_list; + channel_list = chan; +} +void pazpar2_event_loop() +{ + event_loop(&channel_list); +} /* * Local variables: