X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Fclient.c;h=5ca81feec0ee2ed4658ebc51469b02b8f9def3c6;hb=00b5d443fda1c15e043993799eb14044ed807e43;hp=5100f80a6294b741f53beeb545cafb2de9f3ba01;hpb=af6b4df01cb04cb343b9e9ff4926db1e02f1d0d0;p=pazpar2-moved-to-github.git diff --git a/src/client.c b/src/client.c index 5100f80..5ca81fe 100644 --- a/src/client.c +++ b/src/client.c @@ -1,5 +1,5 @@ /* This file is part of Pazpar2. - Copyright (C) 2006-2011 Index Data + Copyright (C) 2006-2012 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 @@ -108,6 +108,7 @@ struct client { struct session *session; char *pquery; // Current search char *cqlquery; // used for SRU targets only + char *addinfo; // diagnostic info for most resent error Odr_int hits; int record_offset; int maxrecs; @@ -138,6 +139,7 @@ struct show_raw { int binary; char *syntax; char *esn; + char *nativesyntax; void (*error_handler)(void *data, const char *addinfo); void (*record_handler)(void *data, const char *buf, size_t sz); void *data; @@ -215,15 +217,15 @@ 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 int nativesyntax_to_type(const char *s, 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) + int binary, + const char *nativesyntax) { ZOOM_record rec = 0; char type[80]; @@ -235,16 +237,13 @@ static void client_show_immediate( error_handler(data, "no resultset"); return; } - rec = ZOOM_resultset_record(resultset, position-1); + rec = ZOOM_resultset_record_immediate(resultset, position-1); if (!rec) { error_handler(data, "no record"); return; } - if (binary) - strcpy(type, "raw"); - else - nativesyntax_to_type(sdb, type, rec); + nativesyntax_to_type(nativesyntax, type, rec); buf = ZOOM_record_get(rec, type, &len); if (!buf) { @@ -261,13 +260,25 @@ 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), - int binary) + int binary, + const char *nativesyntax) { + if (!nativesyntax) + { + if (binary) + nativesyntax = "raw"; + else + { + struct session_database *sdb = client_get_database(cl); + nativesyntax = session_setting_oneval(sdb, PZ_NATIVESYNTAX); + } + } + if (syntax == 0 && esn == 0) client_show_immediate(cl->resultset, client_get_database(cl), position, data, error_handler, record_handler, - binary); + binary, nativesyntax); else { struct show_raw *rr, **rrp; @@ -291,6 +302,10 @@ int client_show_raw_begin(struct client *cl, int position, rr->esn = xstrdup(esn); else rr->esn = 0; + + assert(nativesyntax); + rr->nativesyntax = xstrdup(nativesyntax); + rr->next = 0; for (rrp = &cl->show_raw; *rrp; rrp = &(*rrp)->next) @@ -317,6 +332,7 @@ static void client_show_raw_delete(struct show_raw *r) { xfree(r->syntax); xfree(r->esn); + xfree(r->nativesyntax); xfree(r); } @@ -385,11 +401,9 @@ static void client_send_raw_present(struct client *cl) connection_continue(co); } -static int nativesyntax_to_type(struct session_database *sdb, char *type, +static int nativesyntax_to_type(const char *s, char *type, ZOOM_record rec) { - const char *s = session_setting_oneval(sdb, PZ_NATIVESYNTAX); - if (s && *s) { if (!strncmp(s, "iso2709", 7)) @@ -407,7 +421,7 @@ static int nativesyntax_to_type(struct session_database *sdb, char *type, yaz_snprintf(type, 80, "txml; charset=%s", cp ? cp+1 : "marc-8s"); } else - return -1; + strcpy(type, s); return 0; } else /* attempt to deduce structure */ @@ -485,14 +499,7 @@ static void ingest_raw_record(struct client *cl, ZOOM_record rec) int len; char type[80]; - if (cl->show_raw->binary) - strcpy(type, "raw"); - else - { - struct session_database *sdb = client_get_database(cl); - nativesyntax_to_type(sdb, type, rec); - } - + nativesyntax_to_type(cl->show_raw->nativesyntax, type, rec); buf = ZOOM_record_get(rec, type, &len); cl->show_raw->record_handler(cl->show_raw->data, buf, len); client_show_raw_dequeue(cl); @@ -573,11 +580,12 @@ static void client_record_ingest(struct client *cl) ZOOM_record rec = 0; ZOOM_resultset resultset = cl->resultset; int offset = cl->record_offset; - if ((rec = ZOOM_resultset_record(resultset, offset))) + if ((rec = ZOOM_resultset_record_immediate(resultset, offset))) { cl->record_offset++; - if (cl->session == 0) - ; + if (cl->session == 0) { + /* no operation */ + } else if (ZOOM_record_error(rec, &msg, &addinfo, 0)) { yaz_log(YLOG_WARN, "Record error %s (%s): %s (rec #%d)", @@ -591,7 +599,8 @@ static void client_record_ingest(struct client *cl) const char *xmlrec; char type[80]; - if (nativesyntax_to_type(sdb, type, rec)) + const char *s = session_setting_oneval(sdb, PZ_NATIVESYNTAX); + if (nativesyntax_to_type(s, type, rec)) yaz_log(YLOG_WARN, "Failed to determine record type"); xmlrec = ZOOM_record_get(rec, type, NULL); if (!xmlrec) @@ -631,8 +640,8 @@ void client_record_response(struct client *cl) if (cl->show_raw && cl->show_raw->active) { ZOOM_record rec = 0; - if ((rec = ZOOM_resultset_record(resultset, - cl->show_raw->position-1))) + if ((rec = ZOOM_resultset_record_immediate( + resultset, cl->show_raw->position-1))) { cl->show_raw->active = 0; ingest_raw_record(cl, rec); @@ -760,7 +769,6 @@ void client_start_search(struct client *cl) yaz_log(YLOG_LOG, "Target %s has preferred status: %d", client_get_id(cl), cl->preferred); } - client_set_state(cl, Client_Working); if (*opt_piggyback) ZOOM_connection_option_set(link, "piggyback", opt_piggyback); @@ -841,11 +849,11 @@ void client_start_search(struct client *cl) if (se->sorted_results->next) { ZOOM_query_destroy(q); - client_set_state_nb(cl, Client_Idle); return; } } } + client_set_state(cl, Client_Working); cl->hits = 0; cl->record_offset = 0; rs = ZOOM_connection_search(link, q); @@ -862,6 +870,7 @@ struct client *client_create(const char *id) cl->startrecs = 0; cl->pquery = 0; cl->cqlquery = 0; + cl->addinfo = 0; cl->database = 0; cl->connection = 0; cl->session = 0; @@ -913,6 +922,8 @@ int client_destroy(struct client *c) c->pquery = 0; xfree(c->cqlquery); c->cqlquery = 0; + xfree(c->addinfo); + c->addinfo = 0; xfree(c->id); assert(!c->connection); facet_limits_destroy(c->facet_limits); @@ -1056,10 +1067,14 @@ const char *client_get_facet_limit_local(struct client *cl, if (p && !strcmp(p + 1, name) && s->value && !strncmp(s->value, "local:", 6)) { + const char *cp = s->value + 6; + while (*cp == ' ') + cp++; + nmem_strsplit_escape2(nmem, "|", value, values, num, 1, '\\', 1); (*l)++; - return name; + return *cp ? cp : name; } } } @@ -1122,8 +1137,9 @@ static int apply_limit(struct session_database *sdb, wrbuf_puts(w_ccl, ")"); } - else if (!strncmp(s->value, "local:", 6)) - ; + else if (!strncmp(s->value, "local:", 6)) { + /* no operation */ + } else { yaz_log(YLOG_WARN, "Target %s: Bad limitmap '%s'", @@ -1304,13 +1320,20 @@ int client_get_num_records(struct client *cl) return cl->record_offset; } -void client_set_diagnostic(struct client *cl, int diagnostic) +void client_set_diagnostic(struct client *cl, int diagnostic, + const char *addinfo) { cl->diagnostic = diagnostic; + xfree(cl->addinfo); + cl->addinfo = 0; + if (addinfo) + cl->addinfo = xstrdup(addinfo); } -int client_get_diagnostic(struct client *cl) +int client_get_diagnostic(struct client *cl, const char **addinfo) { + if (addinfo) + *addinfo = cl->addinfo; return cl->diagnostic; }