X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Fpazpar2.c;h=63966b1d8ad2623f7aa3d29aaf525eefc9354407;hb=13cadf98675c15f9be29c417dca2f6f63a33e658;hp=9465ef65b650a55a9efbc96e08ec3e842f89e910;hpb=59f03637638041bd0e8540c0ab76991dc178bdbf;p=pazpar2-moved-to-github.git diff --git a/src/pazpar2.c b/src/pazpar2.c index 9465ef6..63966b1 100644 --- a/src/pazpar2.c +++ b/src/pazpar2.c @@ -1,4 +1,4 @@ -/* $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 #include @@ -50,7 +50,7 @@ static int client_prep_connection(struct client *cl); 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 @@ -88,7 +88,6 @@ struct parameters global_parameters = 100, MAX_CHUNK, 0, - 0, 0 }; @@ -231,9 +230,9 @@ static void send_search(IOCHAN i) 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); @@ -281,7 +280,7 @@ static void send_present(IOCHAN i) 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); @@ -302,7 +301,7 @@ static void do_initResponse(IOCHAN i, Z_APDU *a) 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) { @@ -319,7 +318,8 @@ static void do_searchResponse(IOCHAN i, Z_APDU *a) 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) { @@ -327,7 +327,8 @@ static void do_searchResponse(IOCHAN i, Z_APDU *a) 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; @@ -340,7 +341,9 @@ static void do_searchResponse(IOCHAN i, Z_APDU *a) 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; } @@ -348,6 +351,19 @@ static void do_searchResponse(IOCHAN i, Z_APDU *a) } } +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; @@ -389,42 +405,6 @@ char *normalize_mergekey(char *buf, int skiparticle) 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; @@ -450,32 +430,35 @@ static void add_facet(struct session *s, const char *type, const char *value) 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"); @@ -497,14 +480,9 @@ static xmlDoc *normalize_record(struct client *cl, Z_External *rec) #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"); @@ -780,12 +758,8 @@ static struct record *ingest_record(struct client *cl, Z_External *rec) // 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; @@ -811,7 +785,9 @@ static void ingest_records(struct client *cl, Z_Records *r) 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; } @@ -841,7 +817,8 @@ static void do_presentResponse(IOCHAN i, Z_APDU *a) 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; } @@ -849,13 +826,15 @@ static void do_presentResponse(IOCHAN i, Z_APDU *a) 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; } } @@ -901,13 +880,14 @@ static void handler(IOCHAN i, int event) 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; } @@ -937,8 +917,13 @@ static void handler(IOCHAN i, int event) 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; } @@ -1046,9 +1031,6 @@ static struct connection *connection_create(struct client *cl) 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, @@ -1607,36 +1589,6 @@ static void start_http_listener(void) 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] = ""; @@ -1759,10 +1711,8 @@ int main(int argc, char **argv) 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);