X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Fpazpar2.c;h=e7b2b4ac048fd96febce47fe1e615bf6e1e3f5fc;hb=cf54154bcc2312c9009ec34b737aaea431b1b831;hp=17ce62fb2c7eb6754b9698f8b7d4c98f3da4ad1f;hpb=6590ecb69cda8c6e25fe137f0130996d2d1ccb9e;p=pazpar2-moved-to-github.git diff --git a/src/pazpar2.c b/src/pazpar2.c index 17ce62f..e7b2b4a 100644 --- a/src/pazpar2.c +++ b/src/pazpar2.c @@ -1,4 +1,4 @@ -/* $Id: pazpar2.c,v 1.20 2007-01-08 19:39:12 quinn Exp $ */; +/* $Id: pazpar2.c,v 1.27 2007-01-11 17:14:06 quinn Exp $ */ #include #include @@ -29,6 +29,8 @@ #include #endif +#include + #include "pazpar2.h" #include "eventl.h" #include "http.h" @@ -70,6 +72,8 @@ static char *client_states[] = { // Note: Some things in this structure will eventually move to configuration struct parameters global_parameters = { + "", + "", 0, 0, 30, @@ -424,6 +428,35 @@ static xmlDoc *normalize_record(struct client *cl, Z_External *rec) return rdoc; } +// Extract what appears to be years from buf, storing highest and +// lowest values. +static int extract_years(const char *buf, int *first, int *last) +{ + *first = -1; + *last = -1; + while (*buf) + { + const char *e; + int len; + + while (*buf && !isdigit(*buf)) + buf++; + len = 0; + for (e = buf; *e && isdigit(*e); e++) + len++; + if (len == 4) + { + int value = atoi(buf); + if (*first < 0 || value < *first) + *first = value; + if (*last < 0 || value > *last) + *last = value; + } + buf = e; + } + return *first; +} + static struct record *ingest_record(struct client *cl, Z_External *rec) { xmlDoc *xdoc = normalize_record(cl, rec); @@ -449,18 +482,15 @@ static struct record *ingest_record(struct client *cl, Z_External *rec) res = nmem_malloc(se->nmem, sizeof(struct record)); res->next = 0; - res->target_offset = -1; - res->term_frequency_vec = 0; res->metadata = nmem_malloc(se->nmem, sizeof(struct record_metadata*) * service->num_metadata); - bzero(res->metadata, sizeof(struct record_metadata*) * service->num_metadata); - res->relevance = 0; + memset(res->metadata, 0, sizeof(struct record_metadata*) * service->num_metadata); mergekey_norm = nmem_strdup(se->nmem, (char*) mergekey); xmlFree(mergekey); normalize_mergekey(mergekey_norm); - cluster = reclist_insert(se->reclist, res, mergekey_norm); + cluster = reclist_insert(se->reclist, res, mergekey_norm, &se->total_merged); if (!cluster) { /* no room for record */ @@ -487,6 +517,7 @@ static struct record *ingest_record(struct client *cl, Z_External *rec) struct conf_metadata *md = 0; struct record_metadata **wheretoput, *newm; int imeta; + int first, last; // First, find out what field we're looking at for (imeta = 0; imeta < service->num_metadata; imeta++) @@ -514,11 +545,21 @@ static struct record *ingest_record(struct client *cl, Z_External *rec) { newm->data.text = nmem_strdup(se->nmem, value); } + else if (md->type == Metadata_type_year) + { + if (extract_years(value, &first, &last) < 0) + continue; + } else { yaz_log(YLOG_WARN, "Unknown type in metadata element %s", type); continue; } + if (md->type == Metadata_type_year && md->merge != Metadata_merge_range) + { + yaz_log(YLOG_WARN, "Only range merging supported for years"); + continue; + } if (md->merge == Metadata_merge_unique) { struct record_metadata *mnode; @@ -542,6 +583,23 @@ static struct record *ingest_record(struct client *cl, Z_External *rec) newm->next = *wheretoput; *wheretoput = newm; } + else if (md->merge == Metadata_merge_range) + { + assert(md->type == Metadata_type_year); + if (!*wheretoput) + { + *wheretoput = newm; + (*wheretoput)->data.year.year1 = first; + (*wheretoput)->data.year.year2 = last; + } + else + { + if (first < (*wheretoput)->data.year.year1) + (*wheretoput)->data.year.year1 = first; + if (last > (*wheretoput)->data.year.year2) + (*wheretoput)->data.year.year2 = last; + } + } else yaz_log(YLOG_WARN, "Don't know how to merge on element name %s", md->name); @@ -805,7 +863,8 @@ static struct connection *connection_create(struct client *cl) if (!(addr = cs_straddr(link, cl->database->host->ipport))) { - yaz_log(YLOG_WARN|YLOG_ERRNO, "Lookup of IP address failed?"); + yaz_log(YLOG_WARN|YLOG_ERRNO, "Lookup of IP address %s failed?", + cl->database->host->ipport); return 0; } @@ -961,7 +1020,7 @@ void load_simpletargets(const char *fn) } assert(addrinfo->ai_family == PF_INET); memcpy(addrbuf, &((struct sockaddr_in*)addrinfo->ai_addr)->sin_addr.s_addr, 4); - sprintf(ipport, "%hhd.%hhd.%hhd.%hhd:%s", + sprintf(ipport, "%u.%u.%u.%u:%s", addrbuf[0], addrbuf[1], addrbuf[2], addrbuf[3], port); host->ipport = xstrdup(ipport); freeaddrinfo(addrinfo); @@ -1158,7 +1217,7 @@ char *search(struct session *se, char *query) se->reclist = reclist_create(se->nmem, maxrecs); extract_terms(se->nmem, query, p); se->relevance = relevance_create(se->nmem, (const char **) p, maxrecs); - se->total_records = se->total_hits = 0; + se->total_records = se->total_hits = se->total_merged = 0; se->expected_maxrecs = maxrecs; } else @@ -1247,6 +1306,17 @@ void report_nmem_stats(void) } #endif +struct record_cluster *show_single(struct session *s, int id) +{ + struct record_cluster *r; + + reclist_rewind(s->reclist); + while ((r = reclist_read_record(s->reclist))) + if (r->recid == id) + return r; + return 0; +} + struct record_cluster **show(struct session *s, int start, int *num, int *total, int *sumhits, NMEM nmem_show) { @@ -1294,7 +1364,7 @@ void statistics(struct session *se, struct statistics *stat) struct client *cl; int count = 0; - bzero(stat, sizeof(*stat)); + memset(stat, 0, sizeof(*stat)); for (cl = se->clients; cl; cl = cl->next) { if (!cl->connection) @@ -1329,13 +1399,55 @@ static CCL_bibset load_cclfile(const char *fn) return res; } +static void start_http_listener(void) +{ + char hp[128] = ""; + struct conf_server *ser = global_parameters.server; + + if (*global_parameters.listener_override) + strcpy(hp, global_parameters.listener_override); + else + { + strcpy(hp, ser->host ? ser->host : ""); + if (ser->port) + { + if (*hp) + strcat(hp, ":"); + sprintf(hp + strlen(hp), "%d", ser->port); + } + } + http_init(hp); +} + +static void start_proxy(void) +{ + char hp[128] = ""; + struct conf_server *ser = global_parameters.server; + + if (*global_parameters.proxy_override) + strcpy(hp, global_parameters.proxy_override); + else if (ser->proxy_host || ser->proxy_port) + { + strcpy(hp, ser->proxy_host ? ser->proxy_host : ""); + if (ser->proxy_port) + { + if (*hp) + strcat(hp, ":"); + sprintf(hp + strlen(hp), "%d", ser->proxy_port); + } + } + else + return; + + http_set_proxyaddr(hp); +} + int main(int argc, char **argv) { int ret; char *arg; - int setport = 0; - if (signal(SIGPIPE, SIG_IGN) < 0) + if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) yaz_log(YLOG_WARN|YLOG_ERRNO, "signal"); yaz_log_init(YLOG_DEFAULT_LEVEL, "pazpar2", 0); @@ -1348,14 +1460,13 @@ int main(int argc, char **argv) exit(1); break; case 'h': - http_init(arg); - setport++; + strcpy(global_parameters.listener_override, arg); break; case 'C': global_parameters.ccl_filter = load_cclfile(arg); break; case 'p': - http_set_proxyaddr(arg); + strcpy(global_parameters.proxy_override, arg); break; case 's': load_simpletargets(arg); @@ -1381,12 +1492,8 @@ int main(int argc, char **argv) } global_parameters.server = config->servers; - if (!setport) - { - fprintf(stderr, "Set command port with -h\n"); - exit(1); - } - + start_http_listener(); + start_proxy(); global_parameters.ccl_filter = load_cclfile("../etc/default.bib"); global_parameters.yaz_marc = yaz_marc_create(); yaz_marc_subfield_str(global_parameters.yaz_marc, "\t");