* Copyright (C) 1995-2007, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: zoom-c.c,v 1.125 2007-04-16 21:53:09 adam Exp $
+ * $Id: zoom-c.c,v 1.133 2007-06-04 09:18:09 adam Exp $
*/
/**
* \file zoom-c.c
#include <yaz/srw.h>
#include <yaz/cql.h>
#include <yaz/ccl.h>
+#include <yaz/query-charset.h>
+#include <yaz/copy_types.h>
static int log_api = 0;
static int log_details = 0;
* This wrapper is just for logging failed lookups. It would be nicer
* if it could cause failure when a lookup fails, but that's hard.
*/
-static int *zoom_yaz_str_to_z3950oid(ZOOM_connection c,
+static Odr_oid *zoom_yaz_str_to_z3950oid(ZOOM_connection c,
int oid_class, const char *str) {
- int *res = yaz_string_to_oid_odr(yaz_oid_std(), oid_class, str,
+ Odr_oid *res = yaz_string_to_oid_odr(yaz_oid_std(), oid_class, str,
c->odr_out);
if (res == 0)
yaz_log(YLOG_WARN, "%p OID lookup (%d, '%s') failed",
c->client_IP = 0;
c->tasks = 0;
+ c->user = 0;
+ c->group = 0;
+ c->password = 0;
+
+ c->maximum_record_size = 0;
+ c->preferred_message_size = 0;
+
c->odr_in = odr_createmem(ODR_DECODE);
c->odr_out = odr_createmem(ODR_ENCODE);
}
yaz_log(log_details, "%p ZOOM_connection_connect connect", c);
xfree(c->proxy);
+ c->proxy = 0;
val = ZOOM_options_get(c->options, "proxy");
if (val && *val)
{
yaz_log(log_details, "%p ZOOM_connection_connect proxy=%s", c, val);
c->proxy = xstrdup(val);
}
- else
- c->proxy = 0;
xfree(c->charset);
+ c->charset = 0;
val = ZOOM_options_get(c->options, "charset");
if (val && *val)
{
yaz_log(log_details, "%p ZOOM_connection_connect charset=%s", c, val);
c->charset = xstrdup(val);
}
- else
- c->charset = 0;
xfree(c->lang);
val = ZOOM_options_get(c->options, "lang");
ZOOM_options_set(c->options, "host", c->host_port);
+ xfree(c->cookie_out);
+ c->cookie_out = 0;
val = ZOOM_options_get(c->options, "cookie");
if (val && *val)
{
c->cookie_out = xstrdup(val);
}
+ xfree(c->client_IP);
+ c->client_IP = 0;
val = ZOOM_options_get(c->options, "clientIP");
if (val && *val)
{
c->client_IP = xstrdup(val);
}
+ xfree(c->group);
+ c->group = 0;
+ val = ZOOM_options_get(c->options, "group");
+ if (val && *val)
+ c->group = xstrdup(val);
+
+ xfree(c->user);
+ c->user = 0;
+ val = ZOOM_options_get(c->options, "user");
+ if (val && *val)
+ c->user = xstrdup(val);
+
+ xfree(c->password);
+ c->password = 0;
+ val = ZOOM_options_get(c->options, "password");
+ if (!val)
+ val = ZOOM_options_get(c->options, "pass");
+
+ if (val && *val)
+ c->password = xstrdup(val);
+
+ c->maximum_record_size =
+ ZOOM_options_get_int(c->options, "maximumRecordSize", 1024*1024);
+ c->preferred_message_size =
+ ZOOM_options_get_int(c->options, "preferredMessageSize", 1024*1024);
+
c->async = ZOOM_options_get_bool(c->options, "async", 0);
yaz_log(log_details, "%p ZOOM_connection_connect async=%d", c, c->async);
xfree(c->cookie_out);
xfree(c->cookie_in);
xfree(c->client_IP);
+ xfree(c->user);
+ xfree(c->group);
+ xfree(c->password);
xfree(c);
}
r->next = 0;
r->databaseNames = 0;
r->num_databaseNames = 0;
+ r->rpn_iconv = 0;
return r;
}
r->query = q;
r->options = ZOOM_options_create_with_parent(c->options);
+
+ {
+ const char *cp = ZOOM_options_get(r->options, "rpnCharset");
+ if (cp)
+ r->rpn_iconv = yaz_iconv_open(cp, "UTF-8");
+ }
+
start = ZOOM_options_get_int(r->options, "start", 0);
count = ZOOM_options_get_int(r->options, "count", 0);
r->next = c->resultsets;
c->resultsets = r;
+
+
if (c->host_port && c->proto == PROTO_HTTP)
{
if (!c->cs)
ZOOM_resultset_sort(ZOOM_resultset r,
const char *sort_type, const char *sort_spec)
{
- (void) ZOOM_resultset_sort(r, sort_type, sort_spec);
+ (void) ZOOM_resultset_sort1(r, sort_type, sort_spec);
}
ZOOM_API(int)
}
ZOOM_query_destroy(r->query);
ZOOM_options_destroy(r->options);
+ if (r->rpn_iconv)
+ yaz_iconv_close(r->rpn_iconv);
odr_destroy(r->odr);
xfree(r->setname);
xfree(r->schema);
for (i = 0; i<200; i++)
{
size_t len;
- int *oid;
+ Odr_oid *oid;
Z_OtherInformation **oi;
char buf[80];
const char *val;
Z_InitRequest *ireq = apdu->u.initRequest;
Z_IdAuthentication *auth = (Z_IdAuthentication *)
odr_malloc(c->odr_out, sizeof(*auth));
- const char *auth_groupId = ZOOM_options_get(c->options, "group");
- const char *auth_userId = ZOOM_options_get(c->options, "user");
- const char *auth_password = ZOOM_options_get(c->options, "password");
char *version;
- /* support the pass for backwards compatibility */
- if (!auth_password)
- auth_password = ZOOM_options_get(c->options, "pass");
-
ODR_MASK_SET(ireq->options, Z_Options_search);
ODR_MASK_SET(ireq->options, Z_Options_present);
ODR_MASK_SET(ireq->options, Z_Options_scan);
odr_prepend(c->odr_out, "ZOOM-C",
ireq->implementationName));
- version = odr_strdup(c->odr_out, "$Revision: 1.125 $");
+ version = odr_strdup(c->odr_out, "$Revision: 1.133 $");
if (strlen(version) > 10) /* check for unexpanded CVS strings */
version[strlen(version)-2] = '\0';
ireq->implementationVersion =
odr_prepend(c->odr_out, &version[11],
ireq->implementationVersion));
- *ireq->maximumRecordSize =
- ZOOM_options_get_int(c->options, "maximumRecordSize", 1024*1024);
- *ireq->preferredMessageSize =
- ZOOM_options_get_int(c->options, "preferredMessageSize", 1024*1024);
+ *ireq->maximumRecordSize = c->maximum_record_size;
+ *ireq->preferredMessageSize = c->preferred_message_size;
- if (auth_groupId || auth_password)
+ if (c->group || c->password)
{
Z_IdPass *pass = (Z_IdPass *) odr_malloc(c->odr_out, sizeof(*pass));
- int i = 0;
pass->groupId = 0;
- if (auth_groupId && *auth_groupId)
- {
- pass->groupId = (char *)
- odr_malloc(c->odr_out, strlen(auth_groupId)+1);
- strcpy(pass->groupId, auth_groupId);
- i++;
- }
+ if (c->group)
+ pass->groupId = odr_strdup(c->odr_out, c->group);
pass->userId = 0;
- if (auth_userId && *auth_userId)
- {
- pass->userId = (char *)
- odr_malloc(c->odr_out, strlen(auth_userId)+1);
- strcpy(pass->userId, auth_userId);
- i++;
- }
+ if (c->user)
+ pass->userId = odr_strdup(c->odr_out, c->user);
pass->password = 0;
- if (auth_password && *auth_password)
- {
- pass->password = (char *)
- odr_malloc(c->odr_out, strlen(auth_password)+1);
- strcpy(pass->password, auth_password);
- i++;
- }
- if (i)
- {
- auth->which = Z_IdAuthentication_idPass;
- auth->u.idPass = pass;
- ireq->idAuthentication = auth;
- }
+ if (c->password)
+ pass->password = odr_strdup(c->odr_out, c->password);
+ auth->which = Z_IdAuthentication_idPass;
+ auth->u.idPass = pass;
+ ireq->idAuthentication = auth;
}
- else if (auth_userId)
+ else if (c->user)
{
auth->which = Z_IdAuthentication_open;
- auth->u.open = (char *)
- odr_malloc(c->odr_out, strlen(auth_userId)+1);
- strcpy(auth->u.open, auth_userId);
+ auth->u.open = odr_strdup(c->odr_out, c->user);
ireq->idAuthentication = auth;
}
if (c->proxy)
set_ZOOM_error(c, ZOOM_ERROR_INVALID_QUERY, 0);
return zoom_complete;
}
-
+ if (r->query->z_query->which == Z_Query_type_1 && r->rpn_iconv)
+ {
+ search_req->query = yaz_copy_Z_Query(r->query->z_query, c->odr_out);
+
+ yaz_query_charset_convert_rpnquery(search_req->query->u.type_1,
+ c->odr_out, r->rpn_iconv);
+ }
search_req->databaseNames = r->databaseNames;
search_req->num_databaseNames = r->num_databaseNames;
static void response_default_diag(ZOOM_connection c, Z_DefaultDiagFormat *r)
{
- int oclass;
+ char oid_name_buf[OID_STR_MAX];
+ const char *oid_name;
char *addinfo = 0;
+ oid_name = yaz_oid_to_string_buf(r->diagnosticSetId, 0, oid_name_buf);
switch (r->which)
{
case Z_DefaultDiagFormat_v2Addinfo:
}
xfree(c->addinfo);
c->addinfo = 0;
- set_dset_error(c, *r->condition,
- yaz_oid_to_string(yaz_oid_std(),
- r->diagnosticSetId, &oclass),
- addinfo, 0);
+ set_dset_error(c, *r->condition, oid_name, addinfo, 0);
}
static void response_diag(ZOOM_connection c, Z_DiagRec *p)
if (diag_rec->which == Z_DiagRec_defaultFormat)
{
Z_DefaultDiagFormat *ddf = diag_rec->u.defaultFormat;
- int oclass;
+ oid_class oclass;
error = *ddf->condition;
switch (ddf->which)
if (!strcmp(type, "render"))
{
Z_External *r = (Z_External *) npr->u.databaseRecord;
- const int *oid = r->direct_reference;
+ const Odr_oid *oid = r->direct_reference;
/* render bibliographic record .. */
if (r->which == Z_External_OPAC)
else if (!strcmp(type, "xml"))
{
Z_External *r = (Z_External *) npr->u.databaseRecord;
- const int *oid = r->direct_reference;
+ const Odr_oid *oid = r->direct_reference;
/* render bibliographic record .. */
if (r->which == Z_External_OPAC)
p_query_scan(scan->odr, PROTO_Z3950, &scan->attributeSet, start);
xfree(freeme);
+ {
+ const char *cp = ZOOM_options_get(scan->options, "rpnCharset");
+ if (cp)
+ {
+ yaz_iconv_t cd = yaz_iconv_open(cp, "UTF-8");
+ if (cd)
+ {
+ yaz_query_charset_convert_apt(scan->termListAndStartPoint,
+ scan->odr, cd);
+ }
+ }
+ }
+
+
scan->databaseNames = set_DatabaseNames(c, c->options,
&scan->num_databaseNames,
scan->odr);
ZOOM_options_set(scan->options, key, val);
}
-static Z_APDU *create_es_package(ZOOM_package p, const int *oid)
+static Z_APDU *create_es_package(ZOOM_package p, const Odr_oid *oid)
{
const char *str;
Z_APDU *apdu = zget_APDU(p->odr_out, Z_APDU_extendedServicesRequest);
const char *recordIdNumber = ZOOM_options_get(p->options, "recordIdNumber");
const char *record_buf = ZOOM_options_get(p->options, "record");
const char *syntax_str = ZOOM_options_get(p->options, "syntax");
+
+ const char *correlationInfo_note =
+ ZOOM_options_get(p->options, "correlationInfo.note");
+ const char *correlationInfo_id =
+ ZOOM_options_get(p->options, "correlationInfo.id");
int action_no = -1;
- int *syntax_oid = 0;
+ Odr_oid *syntax_oid = 0;
if (!syntax_str)
syntax_str = "xml";
else
notToKeep->elements[0]->u.opaque = 0;
notToKeep->elements[0]->supplementalId = 0;
- notToKeep->elements[0]->correlationInfo = 0;
+ if (correlationInfo_note || correlationInfo_id)
+ {
+ Z_IUCorrelationInfo *ci;
+ ci = notToKeep->elements[0]->correlationInfo =
+ odr_malloc(p->odr_out, sizeof(*ci));
+ ci->note = correlationInfo_note ?
+ odr_strdup(p->odr_out, correlationInfo_note) : 0;
+ ci->id = correlationInfo_id ?
+ odr_intdup(p->odr_out, atoi(correlationInfo_id)) : 0;
+ }
+ else
+ notToKeep->elements[0]->correlationInfo = 0;
notToKeep->elements[0]->record =
z_ext_record_oid(p->odr_out, syntax_oid,
record_buf, strlen(record_buf));
static void set_init_option(const char *name, void *clientData) {
- ZOOM_connection c = clientData;
+ ZOOM_connection c = (ZOOM_connection) clientData;
char buf[80];
sprintf(buf, "init_opt_%.70s", name);
static void handle_http(ZOOM_connection c, Z_HTTP_Response *hres)
{
int ret = -1;
- const char *content_type = z_HTTP_header_lookup(hres->headers,
- "Content-Type");
+ const char *addinfo = 0;
const char *connection_head = z_HTTP_header_lookup(hres->headers,
"Connection");
ZOOM_connection_set_mask(c, 0);
yaz_log(log_details, "%p handle_http", c);
-
- if (content_type && !yaz_strcmp_del("text/xml", content_type, "; "))
+
+ if (!yaz_srw_check_content_type(hres))
+ addinfo = "content-type";
+ else
{
Z_SOAP *soap_package = 0;
ODR o = c->odr_in;
if (hres->code != 200)
set_HTTP_error(c, hres->code, 0, 0);
else
- set_ZOOM_error(c, ZOOM_ERROR_DECODE, 0);
+ set_ZOOM_error(c, ZOOM_ERROR_DECODE, addinfo);
do_close(c);
}
ZOOM_connection_remove_task(c);
static void cql2pqf_wrbuf_puts(const char *buf, void *client_data)
{
- WRBUF wrbuf = client_data;
+ WRBUF wrbuf = (WRBUF) client_data;
wrbuf_puts(wrbuf, buf);
}