X-Git-Url: http://lists.indexdata.com/cgi-bin?a=blobdiff_plain;f=src%2Fclient.c;h=a7d069d55e98bc00774f5dd1c0c11b6c00fe0fbd;hb=5c017d34db6ea43ee6a95b8c462b9b824c26fbb8;hp=d17e64086bd4d07606c8db26cd668085c69f5357;hpb=6755b9a05f1a95ce8fa468bcfb9458e158e9f5a8;p=pazpar2-moved-to-github.git diff --git a/src/client.c b/src/client.c index d17e640..a7d069d 100644 --- a/src/client.c +++ b/src/client.c @@ -59,21 +59,22 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #endif #include "pazpar2.h" - +#include "parameters.h" #include "client.h" #include "connection.h" #include "settings.h" +#include "relevance.h" /** \brief Represents client state for a connection to one search target */ struct client { struct session_database *database; - struct conf_server *server; struct connection *connection; struct session *session; char *pquery; // Current search char *cqlquery; // used for SRU targets only int hits; int record_offset; + int maxrecs; int diagnostic; enum client_state state; struct show_raw *show_raw; @@ -102,7 +103,7 @@ static const char *client_states[] = { "Client_Disconnected" }; -static struct client *client_freelist = 0; +static struct client *client_freelist = 0; /* thread pr */ const char *client_get_state_str(struct client *cl) { @@ -254,6 +255,13 @@ int client_show_raw_begin(struct client *cl, int position, return 0; } +static void client_show_raw_delete(struct show_raw *r) +{ + xfree(r->syntax); + xfree(r->esn); + xfree(r); +} + void client_show_raw_remove(struct client *cl, void *data) { struct show_raw *rr = data; @@ -263,7 +271,7 @@ void client_show_raw_remove(struct client *cl, void *data) if (*rrp) { *rrp = rr->next; - xfree(rr); + client_show_raw_delete(rr); } } @@ -272,7 +280,7 @@ void client_show_raw_dequeue(struct client *cl) struct show_raw *rr = cl->show_raw; cl->show_raw = rr->next; - xfree(rr); + client_show_raw_delete(rr); } static void client_show_raw_error(struct client *cl, const char *addinfo) @@ -489,6 +497,8 @@ void client_start_search(struct client *cl) const char *opt_requestsyn = session_setting_oneval(sdb, PZ_REQUESTSYNTAX); const char *opt_maxrecs = session_setting_oneval(sdb, PZ_MAXRECS); const char *opt_sru = session_setting_oneval(sdb, PZ_SRU); + const char *opt_sort = session_setting_oneval(sdb, PZ_SORT); + char maxrecs_str[24]; assert(link); @@ -509,24 +519,29 @@ void client_start_search(struct client *cl) ZOOM_connection_option_set(link, "elementSetName", opt_elements); if (*opt_requestsyn) ZOOM_connection_option_set(link, "preferredRecordSyntax", opt_requestsyn); - if (*opt_maxrecs) - ZOOM_connection_option_set(link, "count", opt_maxrecs); - else + + if (!*opt_maxrecs) { - char n[128]; - sprintf(n, "%d", global_parameters.toget); - ZOOM_connection_option_set(link, "count", n); + sprintf(maxrecs_str, "%d", cl->maxrecs); + opt_maxrecs = maxrecs_str; } + ZOOM_connection_option_set(link, "count", opt_maxrecs); + + if (atoi(opt_maxrecs) > 20) + ZOOM_connection_option_set(link, "presentChunk", "20"); + else + ZOOM_connection_option_set(link, "presentChunk", opt_maxrecs); + if (databaseName) ZOOM_connection_option_set(link, "databaseName", databaseName); - ZOOM_connection_option_set(link, "presentChunk", "20"); - if (cl->cqlquery) { ZOOM_query q = ZOOM_query_create(); yaz_log(YLOG_LOG, "Search %s CQL: %s", sdb->database->url, cl->cqlquery); ZOOM_query_cql(q, cl->cqlquery); + if (*opt_sort) + ZOOM_query_sortby(q, opt_sort); rs = ZOOM_connection_search(link, q); ZOOM_query_destroy(q); } @@ -550,6 +565,7 @@ struct client *client_create(void) } else r = xmalloc(sizeof(struct client)); + r->maxrecs = 100; r->pquery = 0; r->cqlquery = 0; r->database = 0; @@ -647,9 +663,10 @@ static char *make_cqlquery(struct client *cl) 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 = cql_transform_rpn2cql_wrbuf(cqlt, wrb, zquery))) { - yaz_log(YLOG_WARN, "failed to generate CQL query, code=%d", status); + yaz_log(YLOG_WARN, "Failed to generate CQL query, code=%d", status); r = 0; } else @@ -681,8 +698,9 @@ int client_parse_query(struct client *cl, const char *query) if (!cn) { client_set_state(cl, Client_Error); - yaz_log(YLOG_WARN, "Failed to parse query for %s", - client_get_database(cl)->database->url); + yaz_log(YLOG_WARN, "Failed to parse CCL query %s for %s", + query, + client_get_database(cl)->database->url); return -1; } wrbuf_rewind(se->wrbuf); @@ -711,8 +729,7 @@ int client_parse_query(struct client *cl, const char *query) extract_terms(se->nmem, cn, p); se->relevance = relevance_create( se->service->relevance_pct, - se->nmem, (const char **) p, - se->expected_maxrecs); + se->nmem, (const char **) p); } ccl_rpn_delete(cn); @@ -772,6 +789,11 @@ const char *client_get_url(struct client *cl) return client_get_database(cl)->database->url; } +void client_set_maxrecs(struct client *cl, int v) +{ + cl->maxrecs = v; +} + /* * Local variables: * c-basic-offset: 4