-/* $Id: pazpar2.c,v 1.60 2007-04-03 03:55:12 quinn Exp $ */
+/* $Id: pazpar2.c,v 1.64 2007-04-08 20:52:09 quinn Exp $ */
#include <stdlib.h>
#include <stdio.h>
static void ingest_records(struct client *cl, Z_Records *r);
//static struct conf_retrievalprofile *database_retrieval_profile(struct database *db);
void session_alert_watch(struct session *s, int what);
-char *session_setting_oneval(struct session *s, struct database *db, const char *name);
+char *session_setting_oneval(struct session *s, struct database *db, int offset);
IOCHAN channel_list = 0; // Master list of connections we're handling events to
100,
MAX_CHUNK,
0,
- 0,
0
};
for (ndb = 0; db->databases[ndb]; ndb++)
databaselist[ndb] = db->databases[ndb];
- if (!(piggyback = session_setting_oneval(se, db, "pz:piggyback")) || *piggyback == '1')
+ if (!(piggyback = session_setting_oneval(se, db, PZ_PIGGYBACK)) || *piggyback == '1')
{
- if ((recsyn = session_setting_oneval(se, db, "pz:syntax")))
+ if ((recsyn = session_setting_oneval(se, db, PZ_NATIVESYNTAX)))
a->u.searchRequest->preferredRecordSyntax =
yaz_str_to_z3950oid(global_parameters.odr_out,
CLASS_RECSYN, recsyn);
a->u.presentRequest->resultSetId = "Default";
- if ((recsyn = session_setting_oneval(se, db, "pz:syntax")))
+ if ((recsyn = session_setting_oneval(se, db, PZ_NATIVESYNTAX)))
a->u.presentRequest->preferredRecordSyntax =
yaz_str_to_z3950oid(global_parameters.odr_out,
CLASS_RECSYN, recsyn);
struct client *cl = co->client;
Z_InitResponse *r = a->u.initResponse;
- yaz_log(YLOG_DEBUG, "Received init response");
+ yaz_log(YLOG_DEBUG, "Init response %s", cl->database->url);
if (*r->result)
{
struct session *se = cl->session;
Z_SearchResponse *r = a->u.searchResponse;
- yaz_log(YLOG_DEBUG, "Searchresponse (status=%d)", *r->searchStatus);
+ yaz_log(YLOG_DEBUG, "Search response %s (status=%d)",
+ cl->database->url, *r->searchStatus);
if (*r->searchStatus)
{
se->total_hits += cl->hits;
if (r->presentStatus && !*r->presentStatus && r->records)
{
- yaz_log(YLOG_DEBUG, "Records in search response");
+ yaz_log(YLOG_DEBUG, "Records in search response %s",
+ cl->database->url);
ingest_records(cl, r->records);
}
cl->state = Client_Idle;
Z_Records *recs = r->records;
if (recs->which == Z_Records_NSD)
{
- yaz_log(YLOG_WARN, "Non-surrogate diagnostic");
+ yaz_log(YLOG_WARN,
+ "Search response: Non-surrogate diagnostic %s",
+ cl->database->url);
cl->diagnostic = *recs->u.nonSurrogateDiagnostic->condition;
cl->state = Client_Error;
}
}
}
+static void do_closeResponse(IOCHAN i, Z_APDU *a)
+{
+ struct connection *co = iochan_getdata(i);
+ struct client *cl = co->client;
+ /* Z_Close *r = a->u.close; */
+
+ yaz_log(YLOG_WARN, "Close response %s", cl->database->url);
+
+ cl->state = Client_Failed;
+ connection_destroy(co);
+}
+
+
char *normalize_mergekey(char *buf, int skiparticle)
{
char *p = buf, *pout = buf;
return buf;
}
-
-#ifdef GAGA
-// FIXME needs to be generalized. Should flexibly generate X lists per search
-static void extract_subject(struct session *s, const char *rec)
-{
- const char *field, *subfield;
-
- while ((field = find_field(rec, "650")))
- {
- rec = field;
- if ((subfield = find_subfield(field, 'a')))
- {
- char *e, *ef;
- char buf[1024];
- int len;
-
- ef = index(subfield, '\n');
- if (!ef)
- return;
- if ((e = index(subfield, '\t')) && e < ef)
- ef = e;
- while (ef > subfield && !isalpha(*(ef - 1)) && *(ef - 1) != ')')
- ef--;
- len = ef - subfield;
- assert(len < 1023);
- memcpy(buf, subfield, len);
- buf[len] = '\0';
-#ifdef FIXME
- if (*buf)
- termlist_insert(s->termlist, buf);
-#endif
- }
- }
-}
-#endif
-
static void add_facet(struct session *s, const char *type, const char *value)
{
int i;
static xmlDoc *normalize_record(struct client *cl, Z_External *rec)
{
- struct conf_retrievalprofile *rprofile = cl->database->rprofile;
- struct conf_retrievalmap *m;
+ struct database_retrievalmap *m;
+ struct database *db = cl->database;
xmlNode *res;
xmlDoc *rdoc;
// First normalize to XML
- if (rprofile->native_syntax == Nativesyn_iso2709)
+ if (db->yaz_marc)
{
char *buf;
int len;
if (rec->which != Z_External_octet)
{
- yaz_log(YLOG_WARN, "Unexpected external branch, probably BER");
+ yaz_log(YLOG_WARN, "Unexpected external branch, probably BER %s",
+ cl->database->url);
return 0;
}
buf = (char*) rec->u.octet_aligned->buf;
len = rec->u.octet_aligned->len;
- if (yaz_marc_read_iso2709(rprofile->yaz_marc, buf, len) < 0)
+ if (yaz_marc_read_iso2709(db->yaz_marc, buf, len) < 0)
{
- yaz_log(YLOG_WARN, "Failed to decode MARC");
+ yaz_log(YLOG_WARN, "Failed to decode MARC %s",
+ cl->database->url);
return 0;
}
- if (yaz_marc_write_xml(rprofile->yaz_marc, &res,
+ if (yaz_marc_write_xml(db->yaz_marc, &res,
"http://www.loc.gov/MARC21/slim", 0, 0) < 0)
{
- yaz_log(YLOG_WARN, "Failed to encode as XML");
+ yaz_log(YLOG_WARN, "Failed to encode as XML %s",
+ cl->database->url);
return 0;
}
rdoc = xmlNewDoc((xmlChar *) "1.0");
#endif
}
- for (m = rprofile->maplist; m; m = m->next)
+ for (m = db->map; m; m = m->next)
{
xmlDoc *new;
- if (m->type != Map_xslt)
- {
- yaz_log(YLOG_WARN, "Unknown map type");
- return 0;
- }
if (!(new = xsltApplyStylesheet(m->stylesheet, rdoc, 0)))
{
yaz_log(YLOG_WARN, "XSLT transformation failed");
// Retrieve first defined value for 'name' for given database.
// Will be extended to take into account user associated with session
-char *session_setting_oneval(struct session *s, struct database *db, const char *name)
+char *session_setting_oneval(struct session *s, struct database *db, int offset)
{
- int offset = settings_offset(name);
-
- if (offset < 0)
- return 0;
if (!db->settings[offset])
return 0;
return db->settings[offset]->value;
cl->records++;
if (npr->which != Z_NamePlusRecord_databaseRecord)
{
- yaz_log(YLOG_WARN, "Unexpected record type, probably diagnostic");
+ yaz_log(YLOG_WARN,
+ "Unexpected record type, probably diagnostic %s",
+ cl->database->url);
continue;
}
Z_Records *recs = r->records;
if (recs->which == Z_Records_NSD)
{
- yaz_log(YLOG_WARN, "Non-surrogate diagnostic");
+ yaz_log(YLOG_WARN, "Non-surrogate diagnostic %s",
+ cl->database->url);
cl->diagnostic = *recs->u.nonSurrogateDiagnostic->condition;
cl->state = Client_Error;
}
if (!*r->presentStatus && cl->state != Client_Error)
{
- yaz_log(YLOG_DEBUG, "Good Present response");
+ yaz_log(YLOG_DEBUG, "Good Present response %s",
+ cl->database->url);
ingest_records(cl, r->records);
cl->state = Client_Idle;
}
else if (*r->presentStatus)
{
- yaz_log(YLOG_WARN, "Bad Present response");
+ yaz_log(YLOG_WARN, "Bad Present response %s",
+ cl->database->url);
cl->state = Client_Error;
}
}
if (len < 0)
{
- yaz_log(YLOG_WARN|YLOG_ERRNO, "Error reading from Z server");
+ yaz_log(YLOG_WARN|YLOG_ERRNO, "Error reading from %s",
+ cl->database->url);
connection_destroy(co);
return;
}
else if (len == 0)
{
- yaz_log(YLOG_WARN, "EOF reading from Z server");
+ yaz_log(YLOG_WARN, "EOF reading from %s", cl->database->url);
connection_destroy(co);
return;
}
case Z_APDU_presentResponse:
do_presentResponse(i, a);
break;
+ case Z_APDU_close:
+ do_closeResponse(i, a);
+ break;
default:
- yaz_log(YLOG_WARN, "Unexpected result from server");
+ yaz_log(YLOG_WARN,
+ "Unexpected Z39.50 response from %s",
+ cl->database->url);
client_fatal(cl);
return;
}
yaz_log(YLOG_DEBUG, "Connection create %s proxy %s",
cl->database->url, global_parameters.zproxy_override);
- yaz_log(YLOG_LOG, "Connection cs_create_host %s proxy %s",
- cl->database->url, global_parameters.zproxy_override);
-
if (!(addr = cs_straddr(link, global_parameters.zproxy_override)))
{
yaz_log(YLOG_WARN|YLOG_ERRNO,
http_init(hp);
}
-// Initialize CCL map for a target
-// Note: This approach ignores user-specific CCL maps, for which I
-// don't presently see any application.
-static void prepare_cclmap(void *context, struct database *db)
-{
- struct setting *s;
-
- if (!db->settings)
- return;
- db->ccl_map = ccl_qual_mk();
- for (s = db->settings[PZ_CCLMAP]; s; s = s->next)
- if (!*s->user)
- {
- char *p = strchr(s->name + 3, ':');
- if (!p)
- {
- yaz_log(YLOG_FATAL, "Malformed cclmap name: %s", s->name);
- exit(1);
- }
- p++;
- ccl_qual_fitem(db->ccl_map, s->value, p);
- }
-}
-
-// Read settings for each database, and prepare a CCL map for that database
-static void prepare_cclmaps(void)
-{
- grep_databases(0, 0, prepare_cclmap);
-}
-
static void start_proxy(void)
{
char hp[128] = "";
else if (global_parameters.server->settings)
settings_read(global_parameters.server->settings);
else
- yaz_log(YLOG_WARN, "No settings-directory specified. Problems may ensue!");
- prepare_cclmaps();
- global_parameters.yaz_marc = yaz_marc_create();
- yaz_marc_subfield_str(global_parameters.yaz_marc, "\t");
+ yaz_log(YLOG_WARN, "No settings-directory specified. Problems may well ensue!");
+ prepare_databases();
global_parameters.odr_in = odr_createmem(ODR_DECODE);
global_parameters.odr_out = odr_createmem(ODR_ENCODE);