Record syntax, piggyback, and element set name controlled by settings system
authorSebastian Hammer <quinn@indexdata.com>
Tue, 3 Apr 2007 03:55:11 +0000 (03:55 +0000)
committerSebastian Hammer <quinn@indexdata.com>
Tue, 3 Apr 2007 03:55:11 +0000 (03:55 +0000)
etc/settings/defaults.xml
src/pazpar2.c
src/settings.c
src/settings.h

index a2f0be3..022ecc1 100644 (file)
@@ -1,5 +1,8 @@
 <settings target="*">
 
+  <set name="pz:syntax" value="usmarc"/>
+  <set name="pz:elements" value="F"/>
+
   <!-- Default query mapping -->
   <!-- Note, individual fields can be overriden per-database and/or per-user -->
 
index 2c95075..9465ef6 100644 (file)
@@ -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 <stdlib.h>
 #include <stdio.h>
@@ -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
index 255a850..54afa71 100644 (file)
@@ -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;
index abb8942..f9f875e 100644 (file)
@@ -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