From 59f03637638041bd0e8540c0ab76991dc178bdbf Mon Sep 17 00:00:00 2001 From: Sebastian Hammer Date: Tue, 3 Apr 2007 03:55:11 +0000 Subject: [PATCH] Record syntax, piggyback, and element set name controlled by settings system --- etc/settings/defaults.xml | 3 +++ src/pazpar2.c | 44 ++++++++++++++++++++++++++++++++++---------- src/settings.c | 6 +++++- src/settings.h | 3 +++ 4 files changed, 45 insertions(+), 11 deletions(-) diff --git a/etc/settings/defaults.xml b/etc/settings/defaults.xml index a2f0be3..022ecc1 100644 --- a/etc/settings/defaults.xml +++ b/etc/settings/defaults.xml @@ -1,5 +1,8 @@ + + + diff --git a/src/pazpar2.c b/src/pazpar2.c index 2c95075..9465ef6 100644 --- a/src/pazpar2.c +++ b/src/pazpar2.c @@ -1,4 +1,4 @@ -/* $Id: pazpar2.c,v 1.59 2007-03-31 20:24:59 marc Exp $ */ +/* $Id: pazpar2.c,v 1.60 2007-04-03 03:55:12 quinn Exp $ */ #include #include @@ -50,6 +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); IOCHAN channel_list = 0; // Master list of connections we're handling events to @@ -200,6 +201,8 @@ static void send_search(IOCHAN i) Z_Query *zquery; struct ccl_rpn_node *cn; int ssub = 0, lslb = 100000, mspn = 10; + char *recsyn; + char *piggyback; yaz_log(YLOG_DEBUG, "Sending search"); @@ -228,12 +231,16 @@ static void send_search(IOCHAN i) for (ndb = 0; db->databases[ndb]; ndb++) databaselist[ndb] = db->databases[ndb]; - a->u.searchRequest->preferredRecordSyntax = - yaz_oidval_to_z3950oid(global_parameters.odr_out, - CLASS_RECSYN, VAL_USMARC); - a->u.searchRequest->smallSetUpperBound = &ssub; - a->u.searchRequest->largeSetLowerBound = &lslb; - a->u.searchRequest->mediumSetPresentNumber = &mspn; + if (!(piggyback = session_setting_oneval(se, db, "pz:piggyback")) || *piggyback == '1') + { + if ((recsyn = session_setting_oneval(se, db, "pz:syntax"))) + a->u.searchRequest->preferredRecordSyntax = + yaz_str_to_z3950oid(global_parameters.odr_out, + CLASS_RECSYN, recsyn); + a->u.searchRequest->smallSetUpperBound = &ssub; + a->u.searchRequest->largeSetLowerBound = &lslb; + a->u.searchRequest->mediumSetPresentNumber = &mspn; + } a->u.searchRequest->resultSetName = "Default"; a->u.searchRequest->databaseNames = databaselist; a->u.searchRequest->num_databaseNames = ndb; @@ -254,9 +261,12 @@ static void send_present(IOCHAN i) { struct connection *co = iochan_getdata(i); struct client *cl = co->client; + struct session *se = cl->session; + struct database *db = cl->database; Z_APDU *a = zget_APDU(global_parameters.odr_out, Z_APDU_presentRequest); int toget; int start = cl->records + 1; + char *recsyn; toget = global_parameters.chunk; if (toget > global_parameters.toget - cl->records) @@ -271,9 +281,10 @@ static void send_present(IOCHAN i) a->u.presentRequest->resultSetId = "Default"; - a->u.presentRequest->preferredRecordSyntax = - yaz_oidval_to_z3950oid(global_parameters.odr_out, - CLASS_RECSYN, VAL_USMARC); + if ((recsyn = session_setting_oneval(se, db, "pz:syntax"))) + a->u.presentRequest->preferredRecordSyntax = + yaz_str_to_z3950oid(global_parameters.odr_out, + CLASS_RECSYN, recsyn); if (send_apdu(cl, a) >= 0) { @@ -767,6 +778,19 @@ static struct record *ingest_record(struct client *cl, Z_External *rec) return res; } +// 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) +{ + int offset = settings_offset(name); + + if (offset < 0) + return 0; + if (!db->settings[offset]) + return 0; + return db->settings[offset]->value; +} + static void ingest_records(struct client *cl, Z_Records *r) { #if USE_TIMING diff --git a/src/settings.c b/src/settings.c index 255a850..54afa71 100644 --- a/src/settings.c +++ b/src/settings.c @@ -1,4 +1,4 @@ -// $Id: settings.c,v 1.5 2007-03-31 19:55:25 marc Exp $ +// $Id: settings.c,v 1.6 2007-04-03 03:55:12 quinn Exp $ // This module implements a generic system of settings (attribute-value) that can // be associated with search targets. The system supports both default values, // per-target overrides, and per-user settings. @@ -28,6 +28,8 @@ static char *hard_settings[] = { "pz:elements", "pz:syntax", "pz:cclmap:", + "pz:charset", + "pz:xslt", 0 }; @@ -44,6 +46,8 @@ int settings_offset(const char *name) { int i; + if (!name) + name = ""; for (i = 0; i < dictionary->num; i++) if (!strcmp(name, dictionary->dict[i])) return i; diff --git a/src/settings.h b/src/settings.h index abb8942..f9f875e 100644 --- a/src/settings.h +++ b/src/settings.h @@ -5,6 +5,8 @@ #define PZ_ELEMENTS 1 #define PZ_SYNTAX 2 #define PZ_CCLMAP 3 +#define PZ_CHARSET 4 +#define PZ_XSLT 5 struct setting { @@ -17,6 +19,7 @@ struct setting }; void settings_read(const char *path); +int settings_offset(const char *name); #endif -- 1.7.10.4