/* This file is part of Pazpar2.
- Copyright (C) 2006-2009 Index Data
+ Copyright (C) 2006-2010 Index Data
Pazpar2 is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
#include <yaz/timing.h>
#endif
-#include "pazpar2.h"
+#include "session.h"
#include "parameters.h"
#include "client.h"
#include "connection.h"
struct session *session;
char *pquery; // Current search
char *cqlquery; // used for SRU targets only
- int hits;
+ Odr_int hits;
int record_offset;
int maxrecs;
int startrecs;
"Client_Disconnected"
};
-static struct client *client_freelist = 0; /* thread pr */
-
const char *client_get_state_str(struct client *cl)
{
return client_states[cl->state];
void client_set_state(struct client *cl, enum client_state st)
{
cl->state = st;
- if (cl->session)
+ /* no need to check for all client being non-active if this one
+ already is. Note that session_active_clients also LOCKS session */
+ if (!client_is_active(cl) && cl->session)
{
int no_active = session_active_clients(cl->session);
if (no_active == 0)
{
strcpy(type, "xml");
}
+ else if (!strncmp(s, "txml", 4))
+ {
+ const char *cp = strchr(s, ';');
+ yaz_snprintf(type, 80, "txml; charset=%s", cp ? cp+1 : "marc-8s");
+ }
else
return -1;
return 0;
strcpy(type, "xml");
return 0;
}
+ else if (!strcmp(syntax, "TXML"))
+ {
+ strcpy(type, "txml");
+ return 0;
+ }
else if (!strcmp(syntax, "USmarc") || !strcmp(syntax, "MARC21"))
{
strcpy(type, "xml; charset=marc8-s");
else
{
struct session_database *sdb = client_get_database(cl);
+ NMEM nmem = nmem_create();
const char *xmlrec;
char type[80];
if (nativesyntax_to_type(sdb, type, rec))
yaz_log(YLOG_WARN, "Failed to determine record type");
if ((xmlrec = ZOOM_record_get(rec, type, NULL)))
{
- if (ingest_record(cl, xmlrec, cl->record_offset))
+ if (!ingest_record(cl, xmlrec, cl->record_offset, nmem))
{
session_alert_watch(cl->session, SESSION_WATCH_SHOW);
session_alert_watch(cl->session, SESSION_WATCH_RECORD);
}
else
yaz_log(YLOG_WARN, "Failed to extract ZOOM record");
+ nmem_destroy(nmem);
}
}
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];
+ char maxrecs_str[24], startrecs_str[24];
assert(link);
else
ZOOM_connection_option_set(link, "presentChunk", opt_maxrecs);
- if (cl->startrecs)
- {
- char startrecs_str[24];
- sprintf(startrecs_str, "%d", cl->startrecs);
-
- ZOOM_connection_option_set(link, "start", startrecs_str);
- }
+ sprintf(startrecs_str, "%d", cl->startrecs);
+ ZOOM_connection_option_set(link, "start", startrecs_str);
if (databaseName)
ZOOM_connection_option_set(link, "databaseName", databaseName);
struct client *client_create(void)
{
- struct client *r;
- if (client_freelist)
- {
- r = client_freelist;
- client_freelist = client_freelist->next;
- }
- else
- r = xmalloc(sizeof(struct client));
+ struct client *r = xmalloc(sizeof(*r));
r->maxrecs = 100;
r->startrecs = 0;
r->pquery = 0;
connection_release(c->connection);
ZOOM_resultset_destroy(c->resultset);
- c->resultset = 0;
- c->next = client_freelist;
- client_freelist = c;
+ xfree(c);
}
void client_set_connection(struct client *cl, struct connection *con)
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;
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));
}
-int client_get_hits(struct client *cl)
+Odr_int client_get_hits(struct client *cl)
{
return cl->hits;
}
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;