char *cqlquery; // used for SRU targets only
int hits;
int record_offset;
+ int maxrecs;
+ int startrecs;
int diagnostic;
enum client_state state;
struct show_raw *show_raw;
}
else
{
- cl->record_offset = 0;
+ cl->record_offset = cl->startrecs;
cl->hits = ZOOM_resultset_size(resultset);
se->total_hits += cl->hits;
}
const char *opt_maxrecs = session_setting_oneval(sdb, PZ_MAXRECS);
const char *opt_sru = session_setting_oneval(sdb, PZ_SRU);
const char *opt_sort = session_setting_oneval(sdb, PZ_SORT);
+ char maxrecs_str[24], startrecs_str[24];
assert(link);
ZOOM_connection_option_set(link, "elementSetName", opt_elements);
if (*opt_requestsyn)
ZOOM_connection_option_set(link, "preferredRecordSyntax", opt_requestsyn);
- if (*opt_maxrecs)
- ZOOM_connection_option_set(link, "count", opt_maxrecs);
- else
+
+ if (!*opt_maxrecs)
{
- char n[128];
- sprintf(n, "%d", global_parameters.toget);
- ZOOM_connection_option_set(link, "count", n);
+ sprintf(maxrecs_str, "%d", cl->maxrecs);
+ opt_maxrecs = maxrecs_str;
}
+ ZOOM_connection_option_set(link, "count", opt_maxrecs);
+
+
+ if (atoi(opt_maxrecs) > 20)
+ ZOOM_connection_option_set(link, "presentChunk", "20");
+ else
+ ZOOM_connection_option_set(link, "presentChunk", opt_maxrecs);
+
+ sprintf(startrecs_str, "%d", cl->startrecs);
+ ZOOM_connection_option_set(link, "start", startrecs_str);
+
if (databaseName)
ZOOM_connection_option_set(link, "databaseName", databaseName);
- ZOOM_connection_option_set(link, "presentChunk", "20");
-
if (cl->cqlquery)
{
ZOOM_query q = ZOOM_query_create();
}
else
r = xmalloc(sizeof(struct client));
+ r->maxrecs = 100;
+ r->startrecs = 0;
r->pquery = 0;
r->cqlquery = 0;
r->database = 0;
ODR odr_out = odr_createmem(ODR_ENCODE);
zquery = p_query_rpn(odr_out, cl->pquery);
+ yaz_log(YLOG_LOG, "PQF: %s", cl->pquery);
if ((status = cql_transform_rpn2cql_wrbuf(cqlt, wrb, zquery)))
{
- yaz_log(YLOG_WARN, "failed to generate CQL query, code=%d", status);
+ yaz_log(YLOG_WARN, "Failed to generate CQL query, code=%d", status);
r = 0;
}
else
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;
if (!cn)
{
client_set_state(cl, Client_Error);
- yaz_log(YLOG_WARN, "Failed to parse query for %s",
- client_get_database(cl)->database->url);
+ yaz_log(YLOG_WARN, "Failed to parse CCL query %s for %s",
+ query,
+ client_get_database(cl)->database->url);
return -1;
}
wrbuf_rewind(se->wrbuf);
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));
extract_terms(se->nmem, cn, p);
se->relevance = relevance_create(
se->service->relevance_pct,
- se->nmem, (const char **) p,
- se->expected_maxrecs);
+ se->nmem, (const char **) p);
}
ccl_rpn_delete(cn);
return cl->record_offset;
}
+void client_set_diagnostic(struct client *cl, int diagnostic)
+{
+ cl->diagnostic = diagnostic;
+}
+
int client_get_diagnostic(struct client *cl)
{
return cl->diagnostic;
return client_get_database(cl)->database->url;
}
+void client_set_maxrecs(struct client *cl, int v)
+{
+ cl->maxrecs = v;
+}
+
+void client_set_startrecs(struct client *cl, int v)
+{
+ cl->startrecs = v;
+}
+
/*
* Local variables:
* c-basic-offset: 4