/* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2010 Index Data
+ * Copyright (C) 1995-2011 Index Data
* See the file LICENSE for details.
*/
/**
* minimize memory allocation/deallocation during normal operation.
*
*/
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
#include <limits.h>
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
-#include <ctype.h>
#if HAVE_SYS_TYPES_H
#include <sys/types.h>
#include <libxml/tree.h>
#endif
-#include <yaz/yconfig.h>
#include <yaz/xmalloc.h>
#include <yaz/comstack.h>
#include "eventl.h"
request_delq(&h->outgoing);
xfree(h);
xmalloc_trav("session closed");
- if (cb && cb->one_shot)
- {
- exit(0);
- }
}
static void do_close_req(association *a, int reason, char *message,
len = strlen(sr->username) + 1;
if (sr->password)
len += strlen(sr->password) + 2;
+ yaz_log(log_requestdetail, "username=%s password-len=%ld",
+ sr->username, (long)
+ (sr->password ? strlen(sr->password) : 0));
auth->which = Z_IdAuthentication_open;
auth->u.open = (char *) odr_malloc(assoc->decode, len);
strcpy(auth->u.open, sr->username);
}
static int cql2pqf(ODR odr, const char *cql, cql_transform_t ct,
- Z_Query *query_result)
+ Z_Query *query_result, char **sortkeys_p)
{
/* have a CQL query and CQL to PQF transform .. */
CQL_parser cp = cql_parser_create();
int srw_errcode = 0;
const char *add = 0;
char rpn_buf[5120];
-
+
+ *sortkeys_p = 0;
r = cql_parser_string(cp, cql);
if (r)
{
}
if (!r)
{
+ struct cql_node *cn = cql_parser_result(cp);
+
/* Syntax OK */
- r = cql_transform_buf(ct,
- cql_parser_result(cp),
- rpn_buf, sizeof(rpn_buf)-1);
+ r = cql_transform_buf(ct, cn, rpn_buf, sizeof(rpn_buf)-1);
if (r)
srw_errcode = cql_transform_error(ct, &add);
+ else
+ {
+ char out[100];
+ int r = cql_sortby_to_sortkeys_buf(cn, out, sizeof(out)-1);
+
+ if (r == 0)
+ {
+ if (*out)
+ yaz_log (log_requestdetail, "srw_sortKeys '%s'", out);
+ *sortkeys_p = odr_strdup(odr, out);
+ }
+ else
+ {
+ yaz_log(log_requestdetail, "failed to create srw_sortKeys");
+ srw_errcode = YAZ_SRW_UNSUPP_SORT_TYPE;
+ }
+ }
}
if (!r)
{
{
Z_Query query;
Z_RPNQuery *rpn;
- int srw_error = cql2pqf(odr, cql, ct, &query);
+ char *sortkeys = 0;
+ int srw_error = cql2pqf(odr, cql, ct, &query, &sortkeys);
if (srw_error)
return srw_error;
if (query.which != Z_Query_type_1 && query.which != Z_Query_type_101)
{
int srw_errcode = cql2pqf(assoc->encode, srw_req->query.cql,
assoc->server->cql_transform,
- rr.query);
+ rr.query,
+ &rr.srw_sortKeys);
+
if (srw_errcode)
{
yaz_add_srw_diagnostic(assoc->encode,
rr.stream = assoc->encode;
rr.decode = assoc->decode;
rr.print = assoc->print;
- if ( srw_req->sort.sortKeys )
+ if (srw_req->sort.sortKeys)
rr.srw_sortKeys = odr_strdup(assoc->encode,
- srw_req->sort.sortKeys );
+ srw_req->sort.sortKeys);
rr.association = assoc;
rr.hits = 0;
rr.errcode = 0;
rr.errstring = 0;
rr.search_info = 0;
+ rr.search_input = 0;
yaz_log_zquery_level(log_requestdetail,rr.query);
(assoc->init->bend_search)(assoc->backend, &rr);
(srw_res->numberOfRecords ?
*srw_res->numberOfRecords : 0));
}
- wrbuf_printf(wr, " %s " ODR_INT_PRINTF " +%d",
+ wrbuf_printf(wr, " %s " ODR_INT_PRINTF "+%d",
(srw_res->resultSetId ?
srw_res->resultSetId : "-"),
(srw_req->startRecord ? *srw_req->startRecord : 1),
keepalive = 1;
hres->version = "1.1";
}
- if (!keepalive)
+ if (!keepalive || !assoc->last_control->keepalive)
{
z_HTTP_header_add(o, &hres->headers, "Connection", "close");
assoc->state = ASSOC_DEAD;
int t;
const char *alive = z_HTTP_header_lookup(hreq->headers, "Keep-Alive");
- if (alive && isdigit(*(const unsigned char *) alive))
+ if (alive && yaz_isdigit(*(const unsigned char *) alive))
t = atoi(alive);
else
t = 15;
}
else
{
- yaz_log(YLOG_DEBUG, " result unavailble");
+ yaz_log(YLOG_DEBUG, " result unavailable");
retval = -1;
}
return retval;
yaz_log(log_requestdetail, "Config: %s",
cb->configname);
- iochan_settimeout(assoc->client_chan, cb->idle_timeout * 60);
+ iochan_settimeout(assoc->client_chan, cb->idle_timeout);
/* we have a backend control block, so call that init function */
if (!(binitres = (*cb->bend_init)(assoc->init)))
}
if (freq.record == 0) /* no error and no record ? */
{
+ *pres = Z_PresentStatus_partial_4;
*next = 0; /* signal end-of-set and stop */
break;
}
thisrec->which = Z_NamePlusRecord_databaseRecord;
if (!freq.output_format)
- freq.output_format = freq.request_format;
+ {
+ yaz_log(YLOG_WARN, "bend_fetch output_format not set");
+ return 0;
+ }
thisrec->u.databaseRecord = z_ext_record_oid(
a->encode, freq.output_format, freq.record, freq.len);
if (!thisrec->u.databaseRecord)
bsrr->errcode = 0;
bsrr->errstring = NULL;
bsrr->search_info = NULL;
+ bsrr->search_input = req->otherInfo;
if (assoc->server && assoc->server->cql_transform
&& req->query->which == Z_Query_type_104
/* have a CQL query and a CQL to PQF transform .. */
int srw_errcode =
cql2pqf(bsrr->stream, req->query->u.type_104->u.cql,
- assoc->server->cql_transform, bsrr->query);
+ assoc->server->cql_transform, bsrr->query,
+ &bsrr->srw_sortKeys);
if (srw_errcode)
bsrr->errcode = yaz_diag_srw_to_bib1(srw_errcode);
}