X-Git-Url: http://lists.indexdata.dk/cgi-bin?a=blobdiff_plain;f=src%2Fpazpar2.c;h=fa2d51fe9e6b57740da7b673d386873118d91b43;hb=0d3944c157baf45465880ccbd72c04945062832d;hp=fd5ebf5403666d185877a802286f5d7fdee77c66;hpb=dde4a5914bbb5511a91e73d8ab45210b48637596;p=pazpar2-moved-to-github.git diff --git a/src/pazpar2.c b/src/pazpar2.c index fd5ebf5..fa2d51f 100644 --- a/src/pazpar2.c +++ b/src/pazpar2.c @@ -1,4 +1,4 @@ -/* $Id: pazpar2.c,v 1.7 2007-01-03 06:23:44 quinn Exp $ */; +/* $Id: pazpar2.c,v 1.16 2007-01-06 03:02:47 quinn Exp $ */; #include #include @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -19,6 +20,11 @@ #include #include +#define USE_TIMING 0 +#if USE_TIMING +#include +#endif + #include "pazpar2.h" #include "eventl.h" #include "command.h" @@ -76,7 +82,6 @@ struct parameters global_parameters = 0 }; - static int send_apdu(struct client *c, Z_APDU *a) { struct connection *co = c->connection; @@ -194,6 +199,8 @@ static void send_present(IOCHAN i) int start = cl->records + 1; toget = global_parameters.chunk; + if (toget > global_parameters.toget - cl->records) + toget = global_parameters.toget - cl->records; if (toget > cl->hits - cl->records) toget = cl->hits - cl->records; @@ -426,6 +433,7 @@ static struct record *ingest_record(struct client *cl, Z_External *rec) if (!(mergekey = xmlGetProp(root, "mergekey"))) { yaz_log(YLOG_WARN, "No mergekey found in record"); + xmlFreeDoc(xdoc); return 0; } @@ -441,6 +449,12 @@ static struct record *ingest_record(struct client *cl, Z_External *rec) res->merge_key = normalize_mergekey(mergekey_norm); head = reclist_insert(se->reclist, res); + if (!head) + { + /* no room for record */ + xmlFreeDoc(xdoc); + return 0; + } relevance_newrec(se->relevance, head); for (n = root->children; n; n = n->next) @@ -451,26 +465,35 @@ static struct record *ingest_record(struct client *cl, Z_External *rec) { xmlChar *type = xmlGetProp(n, "type"); xmlChar *value = xmlNodeListGetString(xdoc, n->children, 0); - add_facet(se, type, value); - relevance_countwords(se->relevance, head, value, 1); + if (type && value) + { + add_facet(se, type, value); + relevance_countwords(se->relevance, head, value, 1); + } xmlFree(type); xmlFree(value); } else if (!strcmp(n->name, "metadata")) { - xmlChar *type = xmlGetProp(n, "type"), *value; - if (!strcmp(type, "title")) - res->title = nmem_strdup(se->nmem, - value = xmlNodeListGetString(xdoc, n->children, 0)); - - relevance_countwords(se->relevance, head, value, 4); + xmlChar *type = xmlGetProp(n, "type"); + if (type && !strcmp(type, "title")) + { + xmlChar *value = xmlNodeListGetString(xdoc, n->children, 0); + if (value) + { + res->title = nmem_strdup(se->nmem, value); + relevance_countwords(se->relevance, head, value, 4); + xmlFree(value); + } + } xmlFree(type); - xmlFree(value); } else yaz_log(YLOG_WARN, "Unexpected element %s in internal record", n->name); } + xmlFreeDoc(xdoc); + relevance_donerecord(se->relevance, head); se->total_records++; @@ -479,6 +502,9 @@ static struct record *ingest_record(struct client *cl, Z_External *rec) static void ingest_records(struct client *cl, Z_Records *r) { +#if USE_TIMING + yaz_timing_t t = yaz_timing_create(); +#endif struct record *rec; struct session *s = cl->session; Z_NamePlusRecordList *rlist; @@ -503,6 +529,14 @@ static void ingest_records(struct client *cl, Z_Records *r) } if (s->watchlist[SESSION_WATCH_RECORDS].fun && rlist->num_records) session_alert_watch(s, SESSION_WATCH_RECORDS); + +#if USE_TIMING + yaz_timing_stop(t); + yaz_log(YLOG_LOG, "ingest_records %6.5f %3.2f %3.2f", + yaz_timing_get_real(t), yaz_timing_get_user(t), + yaz_timing_get_sys(t)); + yaz_timing_destroy(&t); +#endif } static void do_presentResponse(IOCHAN i, Z_APDU *a) @@ -778,13 +812,16 @@ static int client_prep_connection(struct client *cl) if (co) { if (co->state == Conn_Connecting) + { cl->state = Client_Connecting; + iochan_setflag(co->iochan, EVENT_OUTPUT); + } else if (co->state == Conn_Open) { if (cl->state == Client_Error || cl->state == Client_Disconnected) cl->state = Client_Idle; + iochan_setflag(co->iochan, EVENT_OUTPUT); } - iochan_setflag(co->iochan, EVENT_OUTPUT); return 1; } else @@ -1014,6 +1051,21 @@ int select_targets(struct session *se) return c; } +int session_active_clients(struct session *s) +{ + struct client *c; + int res = 0; + + for (c = s->clients; c; c = c->next) + if (c->connection && (c->state == Client_Connecting || + c->state == Client_Initializing || + c->state == Client_Searching || + c->state == Client_Presenting)) + res++; + + return res; +} + char *search(struct session *se, char *query) { int live_channels = 0; @@ -1117,9 +1169,7 @@ struct termlist_score **termlist(struct session *s, const char *name, int *num) return 0; } -#ifdef REPORT_NMEM -// conditional compilation by SH: This lead to a warning with currently installed -// YAZ header files on us1 +#ifdef MISSING_HEADERS void report_nmem_stats(void) { size_t in_use, is_free; @@ -1138,7 +1188,9 @@ struct record **show(struct session *s, int start, int *num, int *total, struct record **recs = nmem_malloc(nmem_show, *num * sizeof(struct record *)); int i; - +#if USE_TIMING + yaz_timing_t t = yaz_timing_create(); +#endif relevance_prepare_read(s->relevance, s->reclist); *total = s->reclist->num_records; @@ -1148,7 +1200,8 @@ struct record **show(struct session *s, int start, int *num, int *total, if (!reclist_read_record(s->reclist)) { *num = 0; - return 0; + recs = 0; + break; } for (i = 0; i < *num; i++) @@ -1161,6 +1214,13 @@ struct record **show(struct session *s, int start, int *num, int *total, } recs[i] = r; } +#if USE_TIMING + yaz_timing_stop(t); + yaz_log(YLOG_LOG, "show %6.5f %3.2f %3.2f", + yaz_timing_get_real(t), yaz_timing_get_user(t), + yaz_timing_get_sys(t)); + yaz_timing_destroy(&t); +#endif return recs; }