X-Git-Url: http://lists.indexdata.dk/cgi-bin?a=blobdiff_plain;f=src%2Fclient.c;h=8e5ffab0a007ad28a2b9efe5cfcfa912a199beda;hb=bb03324e36af45daebeec54c3737b7d6c3591878;hp=d9c2287475a44987b7f789b7ecc03d02ec7992c4;hpb=242a5cc1d459374cbdd0e1a4e102efdf386063f6;p=pazpar2-moved-to-github.git diff --git a/src/client.c b/src/client.c index d9c2287..8e5ffab 100644 --- a/src/client.c +++ b/src/client.c @@ -136,10 +136,14 @@ enum client_state client_get_state(struct client *cl) void client_set_state(struct client *cl, enum client_state st) { + int was_active = 0; + if (client_is_active(cl)) + was_active = 1; cl->state = st; - /* no need to check for all client being non-active if this one - already is. Note that session_active_clients also LOCKS session */ - if (!client_is_active(cl) && cl->session) + /* If client is going from being active to inactive and all clients + are now idle we fire a watch for the session . The assumption is + that session is not mutex locked if client is already active */ + if (was_active && !client_is_active(cl) && cl->session) { int no_active = session_active_clients(cl->session); if (no_active == 0) @@ -557,6 +561,12 @@ static int client_set_facets_request(struct client *cl, ZOOM_connection link) { struct session_database *sdb = client_get_database(cl); const char *opt_facet_term_sort = session_setting_oneval(sdb, PZ_TERMLIST_TERM_SORT); const char *opt_facet_term_count = session_setting_oneval(sdb, PZ_TERMLIST_TERM_COUNT); + /* Disable when no count is set */ + if (opt_facet_term_count == 0 || opt_facet_term_count[0] == '\0') { + yaz_log(YLOG_LOG, "Resetting ZOOM facets option to empty."); + ZOOM_connection_option_set(link, "facets", ""); + return 0; + } struct session *session = client_get_session(cl); struct conf_service *service = session->service; int num = service->num_metadata; @@ -834,6 +844,34 @@ static char *make_cqlquery(struct client *cl) return r; } +// returns a xmalloced SOLR query corresponding to the pquery in client +// TODO Could prob. be merge with the similar make_cqlquery +static char *make_solrquery(struct client *cl) +{ + cql_transform_t sqlt = solr_transform_create(); + Z_RPNQuery *zquery; + char *r; + WRBUF wrb = wrbuf_alloc(); + int status; + ODR odr_out = odr_createmem(ODR_ENCODE); + + zquery = p_query_rpn(odr_out, cl->pquery); + yaz_log(YLOG_LOG, "PQF: %s", cl->pquery); + if ((status = solr_transform_rpn2solr_wrbuf(sqlt, wrb, zquery))) + { + yaz_log(YLOG_WARN, "Failed to generate SOLR query, code=%d", status); + r = 0; + } + else + { + r = xstrdup(wrbuf_cstr(wrb)); + } + wrbuf_destroy(wrb); + odr_destroy(odr_out); + cql_transform_close(sqlt); + return r; +} + // Parse the query given the settings specific to this client int client_parse_query(struct client *cl, const char *query) { @@ -891,6 +929,8 @@ int client_parse_query(struct client *cl, const char *query) xfree(cl->cqlquery); if (*sru) { + if (!strcmp(sru, "solr") + if (!(cl->cqlquery = make_cqlquery(cl))) return -1; }