From e6f35b732fe9838d5573cb49e57c0d2b02481324 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Fri, 1 May 2009 12:37:12 +0200 Subject: [PATCH] Command record may return cached records (bug #2799). The 'record' command with argument 'offset' given but with no 'syntax' and 'esn' parameter now fetches records from last search. This allows fast retrieval of marcxml and raw records. If, OTOH, esn and syntax is given the record is assumed not to be cached and a new present request is fired as before. --- src/client.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++- src/client.h | 9 +++++++++ src/http_command.c | 36 ++++++++++++++++++++++++++++-------- 3 files changed, 87 insertions(+), 9 deletions(-) diff --git a/src/client.c b/src/client.c index 1d35d95..e1ced23 100644 --- a/src/client.c +++ b/src/client.c @@ -154,6 +154,54 @@ 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); + +int client_show_raw_immediate(struct client *cl, int position, + const char *syntax, const char *esn, + void *data, + void (*error_handler)(void *data, const char *addinfo), + void (*record_handler)(void *data, const char *buf, + size_t sz), + int binary) +{ + struct connection *co = cl->connection; + struct session_database *sdb = client_get_database(cl); + ZOOM_resultset resultset = 0; + ZOOM_record rec = 0; + char type[80]; + const char *buf; + int len; + + if (!co) + return -1; + + resultset = connection_get_resultset(co); + if (!resultset) + { + error_handler(data, "no resultset"); + return 0; + } + rec = ZOOM_resultset_record(resultset, position-1); + if (!rec) + { + error_handler(data, "no record"); + return 0; + } + 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 0; + } + record_handler(data, buf, len); + return 0; +} + int client_show_raw_begin(struct client *cl, int position, const char *syntax, const char *esn, @@ -271,7 +319,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); diff --git a/src/client.h b/src/client.h index 7db53d6..64713a1 100644 --- a/src/client.h +++ b/src/client.h @@ -45,6 +45,15 @@ int client_show_raw_begin(struct client *cl, int position, size_t sz), void **data2, int binary); + +int client_show_raw_immediate(struct client *cl, int position, + const char *syntax, const char *esn, + void *data, + void (*error_handler)(void *data, const char *addinfo), + void (*record_handler)(void *data, const char *buf, + size_t sz), + int binary); + void client_show_raw_remove(struct client *cl, void *rr); const char *client_get_state_str(struct client *cl); diff --git a/src/http_command.c b/src/http_command.c index 8ec3264..9ca5481 100644 --- a/src/http_command.c +++ b/src/http_command.c @@ -593,20 +593,40 @@ static void cmd_record(struct http_channel *c) error(rs, PAZPAR2_RECORD_FAIL, "no record at offset given"); return; } + else if (syntax == 0 && esn == 0) + { + http_channel_observer_t obs = + http_add_observer(c, r->client, show_raw_reset); + int ret = client_show_raw_immediate( + r->client, r->position, syntax, esn, + obs, + show_raw_record_error, + (binary ? + show_raw_record_ok_binary : + show_raw_record_ok), + (binary ? 1 : 0)); + if (ret == -1) + { + http_remove_observer(obs); + error(rs, PAZPAR2_NO_SESSION, 0); + return; + } + } else { void *data2; http_channel_observer_t obs = http_add_observer(c, r->client, show_raw_reset); int ret = - client_show_raw_begin(r->client, r->position, syntax, esn, - obs /* data */, - show_raw_record_error, - (binary ? - show_raw_record_ok_binary : - show_raw_record_ok), - &data2, - (binary ? 1 : 0)); + client_show_raw_begin( + r->client, r->position, syntax, esn, + obs /* data */, + show_raw_record_error, + (binary ? + show_raw_record_ok_binary : + show_raw_record_ok), + &data2, + (binary ? 1 : 0)); if (ret == -1) { http_remove_observer(obs); -- 1.7.10.4