/* 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,
else if (res <= 0)
{
yaz_log(log_session, "Connection closed by client");
- assoc->state = ASSOC_DEAD;
+ cs_close(conn);
+ destroy_association(assoc);
+ iochan_destroy(h);
return 0;
}
else if (res == 1) /* incomplete read - wait for more */
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;
{0, 0, 0}
};
char ctype[80];
- int ret;
p = z_get_HTTP_Response(o, 200);
hres = p->u.HTTP_Response;
if (stylesheet && *stylesheet == '\0')
stylesheet = 0;
- ret = z_soap_codec_enc_xsl(assoc->encode, &soap_package,
- &hres->content_buf, &hres->content_len,
- soap_handlers, charset, stylesheet);
+ z_soap_codec_enc_xsl(assoc->encode, &soap_package,
+ &hres->content_buf, &hres->content_len,
+ soap_handlers, charset, stylesheet);
hres->code = http_code;
strcpy(ctype, "text/xml");
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;
}
if (freq.record == 0) /* no error and no record ? */
{
+ *pres = Z_PresentStatus_partial_4;
*next = 0; /* signal end-of-set and stop */
break;
}
bsrr->extra_args = 0;
bsrr->extra_response_data = 0;
- yaz_log (log_requestdetail, "ResultSet '%s'", req->resultSetName);
+ yaz_log(log_requestdetail, "ResultSet '%s'", req->resultSetName);
if (req->databaseNames)
{
int i;
/* 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);
}
Odr_int *next;
Odr_int *num;
int errcode = 0;
- const char *errstring = 0;
yaz_log(log_requestdetail, "Got PresentRequest.");
resp->records = diagrec(assoc, bprr->errcode, bprr->errstring);
*resp->presentStatus = Z_PresentStatus_failure;
errcode = bprr->errcode;
- errstring = bprr->errstring;
}
}
apdu = (Z_APDU *)odr_malloc(assoc->encode, sizeof(*apdu));
if (req->stepSize)
step_size = odr_int_to_int(*req->stepSize);
+ res->stepSize = 0;
res->scanStatus = scanStatus;
res->numberOfEntriesReturned = numberOfEntriesReturned;
res->positionOfTerm = 0;