-/* $Id: pazpar2.c,v 1.30 2007-01-15 04:34:28 quinn Exp $ */
+/* $Id: pazpar2.c,v 1.47 2007-02-04 21:48:21 quinn Exp $ */
#include <stdlib.h>
#include <stdio.h>
for (ndb = 0; db->databases[ndb]; ndb++)
databaselist[ndb] = db->databases[ndb];
- a->u.presentRequest->preferredRecordSyntax =
+ a->u.searchRequest->preferredRecordSyntax =
yaz_oidval_to_z3950oid(global_parameters.odr_out,
CLASS_RECSYN, VAL_USMARC);
a->u.searchRequest->smallSetUpperBound = &ssub;
if (r->presentStatus && !*r->presentStatus && r->records)
{
yaz_log(YLOG_DEBUG, "Records in search response");
- cl->records += *r->numberOfRecordsReturned;
ingest_records(cl, r->records);
}
cl->state = Client_Idle;
p++;
}
if (buf != pout)
- *pout = '\0';
+ do {
+ *(pout--) = '\0';
+ }
+ while (pout > buf && *pout == ' ');
return buf;
}
{
int i;
+ if (!*value)
+ return;
for (i = 0; i < s->num_termlists; i++)
if (!strcmp(s->termlists[i].name, type))
break;
termlist_insert(s->termlists[i].termlist, value);
}
-int yaz_marc_write_xml();
-
static xmlDoc *normalize_record(struct client *cl, Z_External *rec)
{
struct conf_retrievalprofile *rprofile = cl->database->rprofile;
yaz_log(YLOG_FATAL, "Unknown native_syntax in normalize_record");
exit(1);
}
+
+ if (global_parameters.dump_records)
+ {
+ fprintf(stderr, "Input Record (normalized):\n----------------\n");
+#if LIBXML_VERSION >= 20600
+ xmlDocFormatDump(stderr, rdoc, 1);
+#else
+ xmlDocDump(stderr, rdoc);
+#endif
+ }
+
for (m = rprofile->maplist; m; m = m->next)
{
xmlDoc *new;
struct record_cluster *cluster;
struct session *se = cl->session;
xmlChar *mergekey, *mergekey_norm;
- xmlChar *type;
- xmlChar *value;
+ xmlChar *type = 0;
+ xmlChar *value = 0;
struct conf_service *service = global_parameters.server->service;
if (!xdoc)
res = nmem_malloc(se->nmem, sizeof(struct record));
res->next = 0;
+ res->client = cl;
res->metadata = nmem_malloc(se->nmem,
sizeof(struct record_metadata*) * service->num_metadata);
memset(res->metadata, 0, sizeof(struct record_metadata*) * service->num_metadata);
normalize_mergekey(mergekey_norm, 0);
cluster = reclist_insert(se->reclist, res, mergekey_norm, &se->total_merged);
+ if (global_parameters.dump_records)
+ yaz_log(YLOG_LOG, "Cluster id %d from %s (#%d)", cluster->recid,
+ cl->database->url, cl->records);
if (!cluster)
{
/* no room for record */
}
relevance_newrec(se->relevance, cluster);
- type = value = 0;
for (n = root->children; n; n = n->next)
{
if (type)
type = xmlGetProp(n, "type");
value = xmlNodeListGetString(xdoc, n->children, 0);
+
+ if (!type || !value)
+ continue;
+
// First, find out what field we're looking at
for (imeta = 0; imeta < service->num_metadata; imeta++)
if (!strcmp(type, service->metadata[imeta].name))
newm->next = 0;
if (md->type == Metadata_type_generic)
{
- newm->data.text = nmem_strdup(se->nmem, value);
+ char *p, *pe;
+ for (p = value; *p && isspace(*p); p++)
+ ;
+ for (pe = p + strlen(p) - 1;
+ pe > p && strchr(" ,/.:([", *pe); pe--)
+ *pe = '\0';
+ newm->data.text = nmem_strdup(se->nmem, p);
+
}
else if (md->type == Metadata_type_year)
{
{
struct record_metadata *mnode;
for (mnode = *wheretoput; mnode; mnode = mnode->next)
- if (!strcmp(mnode->data.text, mnode->data.text))
+ if (!strcmp(mnode->data.text, newm->data.text))
break;
if (!mnode)
{
normalize_mergekey(s,
(sk->type == Metadata_sortkey_skiparticle));
cluster->sortkeys[md->sortkey_offset]->text = s;
- yaz_log(YLOG_LOG, "SK Longest: %s", s);
}
}
}
(*wheretoput)->data.number.min = first;
if (last > (*wheretoput)->data.number.max)
(*wheretoput)->data.number.max = last;
- if (sk)
- {
- union data_types *sdata = cluster->sortkeys[md->sortkey_offset];
- sdata->number.min = first;
- sdata->number.max = last;
- }
}
+#ifdef GAGA
if (sk)
{
union data_types *sdata = cluster->sortkeys[md->sortkey_offset];
yaz_log(YLOG_LOG, "SK range: %d-%d", sdata->number.min, sdata->number.max);
}
+#endif
}
else
yaz_log(YLOG_WARN, "Don't know how to merge on element name %s", md->name);
if (md->rank)
relevance_countwords(se->relevance, cluster, value, md->rank);
if (md->termlist)
- add_facet(se, type, value);
+ {
+ if (md->type == Metadata_type_year)
+ {
+ char year[64];
+ sprintf(year, "%d", last);
+ add_facet(se, type, year);
+ if (first != last)
+ {
+ sprintf(year, "%d", first);
+ add_facet(se, type, year);
+ }
+ }
+ else
+ add_facet(se, type, value);
+ }
xmlFree(type);
xmlFree(value);
type = value = 0;
else
yaz_log(YLOG_WARN, "Unexpected element %s in internal record", n->name);
}
+ if (type)
+ xmlFree(type);
+ if (value)
+ xmlFree(value);
xmlFreeDoc(xdoc);
{
Z_NamePlusRecord *npr = rlist->records[i];
+ cl->records++;
if (npr->which != Z_NamePlusRecord_databaseRecord)
{
yaz_log(YLOG_WARN, "Unexpected record type, probably diagnostic");
if (!*r->presentStatus && cl->state != Client_Error)
{
yaz_log(YLOG_DEBUG, "Good Present response");
- cl->records += *r->numberOfRecordsReturned;
ingest_records(cl, r->records);
cl->state = Client_Idle;
}
while (fgets(line, 255, f))
{
char *url, *db;
+ char *name;
struct host *host;
struct database *database;
if (strncmp(line, "target ", 7))
continue;
+ line[strlen(line) - 1] = '\0';
+
+ if ((name = strchr(line, ';')))
+ *(name++) = '\0';
+
url = line + 7;
- url[strlen(url) - 1] = '\0';
- yaz_log(YLOG_DEBUG, "Target: %s", url);
if ((db = strchr(url, '/')))
*(db++) = '\0';
else
db = "Default";
+ yaz_log(YLOG_LOG, "Target: %s, '%s'", url, db);
for (host = hosts; host; host = host->next)
if (!strcmp(url, host->hostport))
break;
strcpy(database->url, url);
strcat(database->url, "/");
strcat(database->url, db);
+ if (name)
+ database->name = xstrdup(name);
+ else
+ database->name = 0;
database->databases = xmalloc(2 * sizeof(char *));
database->databases[0] = xstrdup(db);
*count = 0;
for (cl = se->clients; cl; cl = cl->next)
{
- strcpy(res[*count].id, cl->database->host->hostport);
+ res[*count].id = cl->database->url;
+ res[*count].name = cl->database->name;
res[*count].hits = cl->hits;
res[*count].records = cl->records;
res[*count].diagnostic = cl->diagnostic;
" -h [host:]port (REST protocol listener)\n"
" -C cclconfig\n"
" -s simpletargetfile\n"
- " -p hostname[:portno] (HTTP proxy)\n");
+ " -p hostname[:portno] (HTTP proxy)\n"
+ " -d (show internal records)\n");
exit(1);
}
}
start_http_listener();
start_proxy();
- global_parameters.ccl_filter = load_cclfile("../etc/default.bib");
+ if (!global_parameters.ccl_filter)
+ 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");
global_parameters.odr_in = odr_createmem(ODR_DECODE);