X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Fclient.c;h=c9ac78f837f7be2404a7af7d41e9664c8363a3cd;hb=7087f7cc9945cfacfbe7341a1099eef773914772;hp=39190c0098616c18277b2953239304d6fc4951ef;hpb=e07a5d5dfcf5be4cc9eb3ab91a60866ff0aee09c;p=pazpar2-moved-to-github.git diff --git a/src/client.c b/src/client.c index 39190c0..c9ac78f 100644 --- a/src/client.c +++ b/src/client.c @@ -114,6 +114,7 @@ struct client { int startrecs; int diagnostic; int preferred; + struct suggestions *suggestions; enum client_state state; struct show_raw *show_raw; ZOOM_resultset resultset; @@ -122,6 +123,14 @@ struct client { char *id; }; +struct suggestions { + NMEM nmem; + int num; + char **misspelled; + char **suggest; + char *passthrough; +}; + struct show_raw { int active; // whether this request has been sent to the server int position; @@ -153,6 +162,11 @@ enum client_state client_get_state(struct client *cl) return cl->state; } +void client_set_state_nb(struct client *cl, enum client_state st) +{ + cl->state = st; +} + void client_set_state(struct client *cl, enum client_state st) { int was_active = 0; @@ -502,6 +516,9 @@ void client_check_preferred_watch(struct client *cl) } +struct suggestions* client_suggestions_create(const char* suggestions_string); +static void client_suggestions_destroy(struct client *cl); + void client_search_response(struct client *cl) { struct connection *co = cl->connection; @@ -524,6 +541,9 @@ void client_search_response(struct client *cl) client_report_facets(cl, resultset); cl->record_offset = cl->startrecs; cl->hits = ZOOM_resultset_size(resultset); + if (cl->suggestions) + client_suggestions_destroy(cl); + cl->suggestions = client_suggestions_create(ZOOM_resultset_option_get(resultset, "suggestions")); } } @@ -539,6 +559,52 @@ void client_got_records(struct client *cl) } } +static void client_record_ingest(struct client *cl) +{ + const char *msg, *addinfo; + ZOOM_record rec = 0; + ZOOM_resultset resultset = cl->resultset; + int offset = cl->record_offset; + if ((rec = ZOOM_resultset_record(resultset, offset))) + { + cl->record_offset++; + if (cl->session == 0) + ; + else if (ZOOM_record_error(rec, &msg, &addinfo, 0)) + { + yaz_log(YLOG_WARN, "Record error %s (%s): %s (rec #%d)", + msg, addinfo, client_get_id(cl), + cl->record_offset); + } + else + { + struct session_database *sdb = client_get_database(cl); + NMEM nmem = nmem_create(); + const char *xmlrec; + char type[80]; + + if (nativesyntax_to_type(sdb, type, rec)) + yaz_log(YLOG_WARN, "Failed to determine record type"); + xmlrec = ZOOM_record_get(rec, type, NULL); + if (!xmlrec) + yaz_log(YLOG_WARN, "ZOOM_record_get failed from %s", + client_get_id(cl)); + else + { + /* OK = 0, -1 = failure, -2 = Filtered */ + if (ingest_record(cl, xmlrec, cl->record_offset, nmem) == -1) + yaz_log(YLOG_WARN, "Failed to ingest from %s", client_get_id(cl)); + } + nmem_destroy(nmem); + } + } + else + { + yaz_log(YLOG_WARN, "Expected record, but got NULL, offset=%d", + offset); + } +} + void client_record_response(struct client *cl) { struct connection *co = cl->connection; @@ -554,11 +620,9 @@ void client_record_response(struct client *cl) } else { - ZOOM_record rec = 0; - const char *msg, *addinfo; - if (cl->show_raw && cl->show_raw->active) { + ZOOM_record rec = 0; if ((rec = ZOOM_resultset_record(resultset, cl->show_raw->position-1))) { @@ -573,49 +637,21 @@ void client_record_response(struct client *cl) } else { - int offset = cl->record_offset; - if ((rec = ZOOM_resultset_record(resultset, offset))) - { - cl->record_offset++; - if (cl->session == 0) - ; - else if (ZOOM_record_error(rec, &msg, &addinfo, 0)) - { - yaz_log(YLOG_WARN, "Record error %s (%s): %s (rec #%d)", - msg, addinfo, client_get_id(cl), - cl->record_offset); - } - else - { - struct session_database *sdb = client_get_database(cl); - NMEM nmem = nmem_create(); - const char *xmlrec; - char type[80]; - - if (nativesyntax_to_type(sdb, type, rec)) - yaz_log(YLOG_WARN, "Failed to determine record type"); - xmlrec = ZOOM_record_get(rec, type, NULL); - if (!xmlrec) - yaz_log(YLOG_WARN, "ZOOM_record_get failed from %s", - client_get_id(cl)); - else - { - /* OK = 0, -1 = failure, -2 = Filtered */ - if (ingest_record(cl, xmlrec, cl->record_offset, nmem) == -1) - yaz_log(YLOG_WARN, "Failed to ingest from %s", client_get_id(cl)); - } - nmem_destroy(nmem); - } - } - else - { - yaz_log(YLOG_WARN, "Expected record, but got NULL, offset=%d", - offset); - } + client_record_ingest(cl); } } } +void client_reingest(struct client *cl) +{ + int i = cl->startrecs; + int to = cl->record_offset; + + cl->record_offset = i; + for (; i < to; i++) + client_record_ingest(cl); +} + static void client_set_facets_request(struct client *cl, ZOOM_connection link) { struct session_database *sdb = client_get_database(cl); @@ -680,6 +716,7 @@ void client_start_search(struct client *cl, const char *sort_strategy_and_spec, assert(link); + cl->hits = 0; cl->record_offset = 0; cl->diagnostic = 0; @@ -785,6 +822,7 @@ struct client *client_create(const char *id) cl->state = Client_Disconnected; cl->show_raw = 0; cl->resultset = 0; + cl->suggestions = 0; cl->mutex = 0; pazpar2_mutex_create(&cl->mutex, "client"); cl->preferred = 0; @@ -1020,7 +1058,8 @@ static void apply_limit(struct session_database *sdb, // Parse the query given the settings specific to this client int client_parse_query(struct client *cl, const char *query, - facet_limits_t facet_limits) + facet_limits_t facet_limits, + const char *startrecs, const char *maxrecs) { struct session *se = client_get_session(cl); struct session_database *sdb = client_get_database(cl); @@ -1032,10 +1071,24 @@ int client_parse_query(struct client *cl, const char *query, const char *pqf_strftime = session_setting_oneval(sdb, PZ_PQF_STRFTIME); const char *query_syntax = session_setting_oneval(sdb, PZ_QUERY_SYNTAX); WRBUF w_ccl, w_pqf; + int ret_value = 1; + if (!ccl_map) return -1; - cl->hits = -1; + + if (maxrecs && atoi(maxrecs) != cl->maxrecs) + { + ret_value = 0; + cl->maxrecs = atoi(maxrecs); + } + + if (startrecs && atoi(startrecs) != cl->startrecs) + { + ret_value = 0; + cl->startrecs = atoi(startrecs); + } + w_ccl = wrbuf_alloc(); wrbuf_puts(w_ccl, query); @@ -1083,8 +1136,12 @@ int client_parse_query(struct client *cl, const char *query, wrbuf_putc(w_pqf, cp[0]); } } - xfree(cl->pquery); - cl->pquery = xstrdup(wrbuf_cstr(w_pqf)); + if (!cl->pquery || strcmp(cl->pquery, wrbuf_cstr(w_pqf))) + { + xfree(cl->pquery); + cl->pquery = xstrdup(wrbuf_cstr(w_pqf)); + ret_value = 0; + } wrbuf_destroy(w_pqf); yaz_log(YLOG_LOG, "PQF query: %s", cl->pquery); @@ -1117,7 +1174,7 @@ int client_parse_query(struct client *cl, const char *query, } ccl_rpn_delete(cn); - return 0; + return ret_value; } void client_set_session(struct client *cl, struct session *se) @@ -1165,6 +1222,37 @@ int client_get_diagnostic(struct client *cl) return cl->diagnostic; } +const char * client_get_suggestions_xml(struct client *cl, WRBUF wrbuf) +{ + /* int idx; */ + struct suggestions *suggestions = cl->suggestions; + + if (!suggestions) { + yaz_log(YLOG_DEBUG, "No suggestions found"); + return ""; + } + if (suggestions->passthrough) { + yaz_log(YLOG_DEBUG, "Passthrough Suggestions: \n%s\n", suggestions->passthrough); + return suggestions->passthrough; + } + if (suggestions->num == 0) { + return ""; + } + /* + for (idx = 0; idx < suggestions->num; idx++) { + wrbuf_printf(wrbuf, "suggest[idx]); + if (suggestions->misspelled[idx] && suggestions->misspelled[idx]) { + wrbuf_puts(wrbuf, suggestions->misspelled[idx]); + wrbuf_puts(wrbuf, "\n"); + } + else + wrbuf_puts(wrbuf, "/>\n"); + } + */ + return wrbuf_cstr(wrbuf); +} + + void client_set_database(struct client *cl, struct session_database *db) { cl->database = db; @@ -1175,26 +1263,57 @@ const char *client_get_id(struct client *cl) return cl->id; } -void client_set_maxrecs(struct client *cl, int v) -{ - cl->maxrecs = v; -} - int client_get_maxrecs(struct client *cl) { return cl->maxrecs; } -void client_set_startrecs(struct client *cl, int v) +void client_set_preferred(struct client *cl, int v) { - cl->startrecs = v; + cl->preferred = v; } -void client_set_preferred(struct client *cl, int v) + +struct suggestions* client_suggestions_create(const char* suggestions_string) { - cl->preferred = v; + int i; + NMEM nmem; + struct suggestions *suggestions; + if (suggestions_string == 0) + return 0; + nmem = nmem_create(); + suggestions = nmem_malloc(nmem, sizeof(*suggestions)); + yaz_log(YLOG_DEBUG, "client target suggestions: %s", suggestions_string); + + suggestions->nmem = nmem; + suggestions->num = 0; + suggestions->misspelled = 0; + suggestions->suggest = 0; + suggestions->passthrough = nmem_strdup_null(nmem, suggestions_string); + + if (suggestions_string) + nmem_strsplit_escape2(suggestions->nmem, "\n", suggestions_string, &suggestions->suggest, + &suggestions->num, 1, '\\', 0); + /* Set up misspelled array */ + suggestions->misspelled = (char **) nmem_malloc(nmem, suggestions->num * sizeof(**suggestions->misspelled)); + /* replace = with \0 .. for each item */ + for (i = 0; i < suggestions->num; i++) + { + char *cp = strchr(suggestions->suggest[i], '='); + if (cp) { + *cp = '\0'; + suggestions->misspelled[i] = cp+1; + } + } + return suggestions; } +static void client_suggestions_destroy(struct client *cl) +{ + NMEM nmem = cl->suggestions->nmem; + cl->suggestions = 0; + nmem_destroy(nmem); +} /* * Local variables: