X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Fclient.c;h=c5b10a8c34d12d0e0ee2eedc1339302338fc4009;hb=3d99aecedf9d6e6ebeadcedbee081049b03dbbf8;hp=d67712e0c4841357424890729a5fd6d00614fa20;hpb=ef3191cc8204cbca5fc4d85bb36476ab91a27ca7;p=pazpar2-moved-to-github.git diff --git a/src/client.c b/src/client.c index d67712e..c5b10a8 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 @@ -34,14 +34,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #if HAVE_UNISTD_H #include #endif -#if HAVE_SYS_SOCKET_H -#include -#endif -#if HAVE_NETDB_H -#include -#endif #include -#include #include #include @@ -65,10 +58,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include #endif -#if HAVE_NETINET_IN_H -#include -#endif - #include "pazpar2.h" #include "client.h" @@ -84,8 +73,6 @@ struct client { char *cqlquery; // used for SRU targets only int hits; int record_offset; - int setno; - int requestid; // ID of current outstanding request int diagnostic; enum client_state state; struct show_raw *show_raw; @@ -106,14 +93,11 @@ struct show_raw { static const char *client_states[] = { "Client_Connecting", - "Client_Connected", "Client_Idle", "Client_Working", "Client_Error", "Client_Failed", - "Client_Disconnected", - "Client_Stopped", - "Client_Continue" + "Client_Disconnected" }; static struct client *client_freelist = 0; @@ -169,13 +153,52 @@ const char *client_get_pquery(struct client *cl) return cl->pquery; } -void client_set_requestid(struct client *cl, int id) +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(struct client *cl, 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) { - cl->requestid = id; -} + 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; + assert(co); + + resultset = connection_get_resultset(co); + 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); +} -static void client_send_raw_present(struct client *cl); int client_show_raw_begin(struct client *cl, int position, const char *syntax, const char *esn, @@ -183,47 +206,51 @@ 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, position, data, + error_handler, record_handler, + binary); else { - client_send_raw_present(cl); + struct show_raw *rr, **rrp; + 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; } @@ -293,7 +320,8 @@ 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(struct session_database *sdb, char *type, + ZOOM_record rec) { const char *s = session_setting_oneval(sdb, PZ_NATIVESYNTAX); @@ -312,7 +340,25 @@ static int nativesyntax_to_type(struct session_database *sdb, char *type) return -1; return 0; } - return -1; + else /* attempt to deduce structure */ + { + const char *syntax = ZOOM_record_get(rec, "syntax", NULL); + if (syntax) + { + if (!strcmp(syntax, "XML")) + { + strcpy(type, "xml"); + return 0; + } + else if (!strcmp(syntax, "USmarc") || !strcmp(syntax, "MARC21")) + { + strcpy(type, "xml; charset=marc8-s"); + return 0; + } + else return -1; + } + else return -1; + } } static void ingest_raw_record(struct client *cl, ZOOM_record rec) @@ -326,7 +372,7 @@ static void ingest_raw_record(struct client *cl, ZOOM_record rec) else { struct session_database *sdb = client_get_database(cl); - nativesyntax_to_type(sdb, type); + nativesyntax_to_type(sdb, type, rec); } buf = ZOOM_record_get(rec, type, &len); @@ -351,6 +397,7 @@ void client_search_response(struct client *cl) } else { + cl->record_offset = 0; cl->hits = ZOOM_resultset_size(resultset); se->total_hits += cl->hits; } @@ -404,7 +451,8 @@ void client_record_response(struct client *cl) struct session_database *sdb = client_get_database(cl); const char *xmlrec; char type[80]; - nativesyntax_to_type(sdb, type); + if (nativesyntax_to_type(sdb, type, rec)) + yaz_log(YLOG_WARN, "Failed to determine record type"); if ((xmlrec = ZOOM_record_get(rec, type, NULL))) { if (ingest_record(cl, xmlrec, cl->record_offset)) @@ -478,12 +526,16 @@ void client_start_search(struct client *cl) 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); rs = ZOOM_connection_search(link, q); ZOOM_query_destroy(q); } else + { + 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); connection_continue(co); } @@ -505,8 +557,6 @@ struct client *client_create(void) r->session = 0; r->hits = 0; r->record_offset = 0; - r->setno = 0; - r->requestid = -1; r->diagnostic = 0; r->state = Client_Disconnected; r->show_raw = 0; @@ -614,6 +664,7 @@ int client_parse_query(struct client *cl, const char *query) int cerror, cpos; CCL_bibset ccl_map = prepare_cclmap(cl); const char *sru = session_setting_oneval(sdb, PZ_SRU); + const char *pqf_prefix = session_setting_oneval(sdb, PZ_PQF_PREFIX); if (!ccl_map) return -1; @@ -628,6 +679,11 @@ int client_parse_query(struct client *cl, const char *query) return -1; } wrbuf_rewind(se->wrbuf); + if (*pqf_prefix) + { + wrbuf_puts(se->wrbuf, pqf_prefix); + wrbuf_puts(se->wrbuf, " "); + } ccl_pquery(se->wrbuf, cn); xfree(cl->pquery); cl->pquery = xstrdup(wrbuf_cstr(se->wrbuf)); @@ -665,8 +721,7 @@ void client_set_session(struct client *cl, struct session *se) int client_is_active(struct client *cl) { - if (cl->connection && (cl->state == Client_Continue || - cl->state == Client_Connecting || + if (cl->connection && (cl->state == Client_Connecting || cl->state == Client_Working)) return 1; return 0; @@ -713,7 +768,9 @@ const char *client_get_url(struct client *cl) /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab */ +