New setting: pz:pqf_strftime
authorAdam Dickmeiss <adam@indexdata.dk>
Tue, 20 Oct 2009 11:54:07 +0000 (13:54 +0200)
committerAdam Dickmeiss <adam@indexdata.dk>
Tue, 20 Oct 2009 11:54:07 +0000 (13:54 +0200)
This setting does all what pqf_prefix does but more. It uses strftime
conversions and reserves %% for the original PQF.

doc/pazpar2_conf.xml
src/client.c
src/settings.c
src/settings.h
test/z3950_indexdata_com_marc.xml

index b0d9a3b..9782efb 100644 (file)
     </varlistentry>
     
     <varlistentry>
+     <term>pz:pqf_strftime</term>
+     <listitem>
+      <para>
+       Allows you to extend a query with dates and operators.
+       The provided string allows certain substitutions and serves as a
+       format string.
+       The special two character sequence '%%' gets converted to the
+       original query. Other characters leading with the percent sign are
+       conversions supported by strftime.
+       All other characters are copied verbatim. For example, the string
+       <literal>@and @attr 1=30 @attr 2=3 %Y %%</literal>
+       would search for current year combined with the original PQF (%%).
+      </para>
+     </listitem>
+    </varlistentry>
+    
+    <varlistentry>
      <term>pz:sort</term>
      <listitem>
       <para>
index 2cd05aa..22d1073 100644 (file)
@@ -695,6 +695,7 @@ int client_parse_query(struct client *cl, const char *query)
     CCL_bibset ccl_map = prepare_cclmap(cl);
     const char *sru = session_setting_oneval(sdb, PZ_SRU);
     const char *pqf_prefix = session_setting_oneval(sdb, PZ_PQF_PREFIX);
+    const char *pqf_strftime = session_setting_oneval(sdb, PZ_PQF_STRFTIME);
 
     if (!ccl_map)
         return -1;
@@ -715,7 +716,26 @@ int client_parse_query(struct client *cl, const char *query)
         wrbuf_puts(se->wrbuf, pqf_prefix);
         wrbuf_puts(se->wrbuf, " ");
     }
-    ccl_pquery(se->wrbuf, cn);
+    if (!pqf_strftime || !*pqf_strftime)
+        ccl_pquery(se->wrbuf, cn);
+    else
+    {
+        time_t cur_time = time(0);
+        struct tm *tm =  localtime(&cur_time);
+        char tmp_str[300];
+        const char *cp = tmp_str;
+
+        /* see man strftime(3) for things .. In particular %% gets converted
+         to %.. And That's our original query .. */
+        strftime(tmp_str, sizeof(tmp_str)-1, pqf_strftime, tm);
+        for (; *cp; cp++)
+        {
+            if (cp[0] == '%')
+                ccl_pquery(se->wrbuf, cn);
+            else
+                wrbuf_putc(se->wrbuf, cp[0]);
+        }
+    }
     xfree(cl->pquery);
     cl->pquery = xstrdup(wrbuf_cstr(se->wrbuf));
 
index db5d7ce..34159eb 100644 (file)
@@ -67,6 +67,7 @@ static char *hard_settings[] = {
     "pz:pqf_prefix",
     "pz:sort",
     "pz:recordfilter",
+    "pz:pqf_strftime",
     0
 };
 
index e1c575e..44ebd6d 100644 (file)
@@ -40,6 +40,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #define PZ_PQF_PREFIX    17
 #define PZ_SORT                 18
 #define PZ_RECORDFILTER         19
+#define PZ_PQF_STRFTIME  20
 
 struct setting
 {
index 26b7bf5..65a3289 100644 (file)
@@ -21,6 +21,7 @@
   <set name="pz:xslt" value="auto"/>
   
   <set name="pz:apdulog" value="1"/>
+  <set name="pz:pqf_strftime" value="@or %% %Y"/>
 
   <!-- Examples of application-specific setting -->
   <!-- Available in output record and/or normalization stylesheet -->