X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fclient.c;h=e3b34cb1ec7b272ed2cd51d3ddcaf8ff06cd96f0;hb=83518ddb5165d783b37a0244bb0f3c79cd1b8398;hp=9cb51409633e8b37c013d79cb6e2a83ab3f5a43c;hpb=c4c6f81c993175e3445af4d6da2c5d152aa33365;p=pazpar2-moved-to-github.git diff --git a/src/client.c b/src/client.c index 9cb5140..e3b34cb 100644 --- a/src/client.c +++ b/src/client.c @@ -1,5 +1,5 @@ /* This file is part of Pazpar2. - Copyright (C) 2006-2008 Index Data + Copyright (C) 2006-2009 Index Data Pazpar2 is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -59,10 +59,11 @@ 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 { @@ -73,10 +74,13 @@ struct client { char *cqlquery; // used for SRU targets only int hits; int record_offset; + int maxrecs; + int startrecs; int diagnostic; enum client_state state; struct show_raw *show_raw; struct client *next; // next client in session or next in free list + ZOOM_resultset resultset; }; struct show_raw { @@ -100,7 +104,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) { @@ -154,6 +158,45 @@ const char *client_get_pquery(struct client *cl) } static void client_send_raw_present(struct client *cl); +static int nativesyntax_to_type(struct session_database *sdb, char *type, + ZOOM_record rec); + +static void client_show_immediate( + ZOOM_resultset resultset, struct session_database *sdb, int position, + void *data, + void (*error_handler)(void *data, const char *addinfo), + void (*record_handler)(void *data, const char *buf, size_t sz), + int binary) +{ + ZOOM_record rec = 0; + char type[80]; + const char *buf; + int len; + + if (!resultset) + { + error_handler(data, "no resultset"); + return; + } + rec = ZOOM_resultset_record(resultset, position-1); + if (!rec) + { + error_handler(data, "no record"); + return; + } + if (binary) + strcpy(type, "raw"); + else + nativesyntax_to_type(sdb, type, rec); + buf = ZOOM_record_get(rec, type, &len); + if (!buf) + { + error_handler(data, "no record"); + return; + } + record_handler(data, buf, len); +} + int client_show_raw_begin(struct client *cl, int position, const char *syntax, const char *esn, @@ -161,51 +204,65 @@ int client_show_raw_begin(struct client *cl, int position, void (*error_handler)(void *data, const char *addinfo), void (*record_handler)(void *data, const char *buf, size_t sz), - void **data2, int binary) { - struct show_raw *rr, **rrp; - if (!cl->connection) - { /* the client has no connection */ - return -1; - } - rr = xmalloc(sizeof(*rr)); - *data2 = rr; - rr->position = position; - rr->active = 0; - rr->data = data; - rr->error_handler = error_handler; - rr->record_handler = record_handler; - rr->binary = binary; - if (syntax) - rr->syntax = xstrdup(syntax); - else - rr->syntax = 0; - if (esn) - rr->esn = xstrdup(esn); - else - rr->esn = 0; - rr->next = 0; - - for (rrp = &cl->show_raw; *rrp; rrp = &(*rrp)->next) - ; - *rrp = rr; - - if (cl->state == Client_Failed) - { - client_show_raw_error(cl, "client failed"); - } - else if (cl->state == Client_Disconnected) - { - client_show_raw_error(cl, "client disconnected"); - } + if (syntax == 0 && esn == 0) + client_show_immediate(cl->resultset, client_get_database(cl), + position, data, + error_handler, record_handler, + binary); else { - client_send_raw_present(cl); + struct show_raw *rr, **rrp; + + if (!cl->connection) + return -1; + + + rr = xmalloc(sizeof(*rr)); + rr->position = position; + rr->active = 0; + rr->data = data; + rr->error_handler = error_handler; + rr->record_handler = record_handler; + rr->binary = binary; + if (syntax) + rr->syntax = xstrdup(syntax); + else + rr->syntax = 0; + if (esn) + rr->esn = xstrdup(esn); + else + rr->esn = 0; + rr->next = 0; + + for (rrp = &cl->show_raw; *rrp; rrp = &(*rrp)->next) + ; + *rrp = rr; + + if (cl->state == Client_Failed) + { + client_show_raw_error(cl, "client failed"); + } + else if (cl->state == Client_Disconnected) + { + client_show_raw_error(cl, "client disconnected"); + } + else + { + client_send_raw_present(cl); + } } 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; @@ -215,7 +272,7 @@ void client_show_raw_remove(struct client *cl, void *data) if (*rrp) { *rrp = rr->next; - xfree(rr); + client_show_raw_delete(rr); } } @@ -224,7 +281,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) @@ -240,7 +297,7 @@ static void client_send_raw_present(struct client *cl) { struct session_database *sdb = client_get_database(cl); struct connection *co = client_get_connection(cl); - ZOOM_resultset set = connection_get_resultset(co); + ZOOM_resultset set = cl->resultset; int offset = cl->show_raw->position; const char *syntax = 0; @@ -271,7 +328,8 @@ static void client_send_raw_present(struct client *cl) connection_continue(co); } -static int nativesyntax_to_type(struct session_database *sdb, char *type, ZOOM_record rec) +static int nativesyntax_to_type(struct session_database *sdb, char *type, + ZOOM_record rec) { const char *s = session_setting_oneval(sdb, PZ_NATIVESYNTAX); @@ -335,7 +393,7 @@ void client_search_response(struct client *cl) struct connection *co = cl->connection; struct session *se = cl->session; ZOOM_connection link = connection_get_link(co); - ZOOM_resultset resultset = connection_get_resultset(co); + ZOOM_resultset resultset = cl->resultset; const char *error, *addinfo; if (ZOOM_connection_error(link, &error, &addinfo)) @@ -347,7 +405,7 @@ void client_search_response(struct client *cl) } else { - cl->record_offset = 0; + cl->record_offset = cl->startrecs; cl->hits = ZOOM_resultset_size(resultset); se->total_hits += cl->hits; } @@ -358,7 +416,7 @@ void client_record_response(struct client *cl) { struct connection *co = cl->connection; ZOOM_connection link = connection_get_link(co); - ZOOM_resultset resultset = connection_get_resultset(co); + ZOOM_resultset resultset = cl->resultset; const char *error, *addinfo; if (ZOOM_connection_error(link, &error, &addinfo)) @@ -440,6 +498,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); @@ -460,24 +520,38 @@ 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); + + if (!*opt_maxrecs) + { + 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 (cl->startrecs) { - char n[128]; - sprintf(n, "%d", global_parameters.toget); - ZOOM_connection_option_set(link, "count", n); + char startrecs_str[24]; + sprintf(startrecs_str, "%d", cl->startrecs); + + ZOOM_connection_option_set(link, "start", startrecs_str); } + if (databaseName) ZOOM_connection_option_set(link, "databaseName", databaseName); - ZOOM_connection_option_set(link, "presentChunk", "20"); - if (cl->cqlquery) { - yaz_log(YLOG_LOG, "Search %s CQL: %s", sdb->database->url, 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); } @@ -486,7 +560,8 @@ void client_start_search(struct client *cl) yaz_log(YLOG_LOG, "Search %s PQF: %s", sdb->database->url, cl->pquery); rs = ZOOM_connection_search_pqf(link, cl->pquery); } - connection_set_resultset(co, rs); + ZOOM_resultset_destroy(cl->resultset); + cl->resultset = rs; connection_continue(co); } @@ -500,6 +575,8 @@ struct client *client_create(void) } else r = xmalloc(sizeof(struct client)); + r->maxrecs = 100; + r->startrecs = 0; r->pquery = 0; r->cqlquery = 0; r->database = 0; @@ -510,6 +587,7 @@ struct client *client_create(void) r->diagnostic = 0; r->state = Client_Disconnected; r->show_raw = 0; + r->resultset = 0; r->next = 0; return r; } @@ -532,6 +610,9 @@ void client_destroy(struct client *c) if (c->connection) connection_release(c->connection); + + ZOOM_resultset_destroy(c->resultset); + c->resultset = 0; c->next = client_freelist; client_freelist = c; } @@ -590,17 +671,21 @@ static char *make_cqlquery(struct client *cl) char *r; WRBUF wrb = wrbuf_alloc(); int status; + ODR odr_out = odr_createmem(ODR_ENCODE); - zquery = p_query_rpn(global_parameters.odr_out, cl->pquery); + 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); - return 0; + yaz_log(YLOG_WARN, "Failed to generate CQL query, code=%d", status); + r = 0; } - r = xstrdup(wrbuf_cstr(wrb)); - + else + { + r = xstrdup(wrbuf_cstr(wrb)); + } wrbuf_destroy(wrb); - odr_reset(global_parameters.odr_out); // releases the zquery + odr_destroy(odr_out); cql_transform_close(cqlt); return r; } @@ -624,8 +709,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); @@ -653,9 +739,8 @@ int client_parse_query(struct client *cl, const char *query) char *p[512]; extract_terms(se->nmem, cn, p); se->relevance = relevance_create( - global_parameters.server->relevance_pct, - se->nmem, (const char **) p, - se->expected_maxrecs); + se->service->relevance_pct, + se->nmem, (const char **) p); } ccl_rpn_delete(cn); @@ -715,10 +800,22 @@ 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; +} + +void client_set_startrecs(struct client *cl, int v) +{ + cl->startrecs = v; +} + /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab */ +