* Copyright (C) 1995-2007, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: zoom-c.c,v 1.120 2007-03-21 09:23:11 adam Exp $
+ * $Id: zoom-c.c,v 1.123 2007-04-12 13:52:57 adam Exp $
*/
/**
* \file zoom-c.c
* 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 Odr_oid *zoom_yaz_str_to_z3950oid(ZOOM_connection c,
- int oid_class, const char *str) {
- Odr_oid *res = yaz_str_to_z3950oid(c->odr_out, oid_class, str);
+static int *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,
+ c->odr_out);
if (res == 0)
yaz_log(YLOG_WARN, "%p OID lookup (%d, '%s') failed",
c, (int) oid_class, str);
}
if (!cp)
cp = "Default";
- nmem_strsplit(odr->mem, "+", cp, &databaseNames, num);
+ nmem_strsplit(odr_getmem(odr), "+", cp, &databaseNames, num);
return databaseNames;
}
s->query_string = odr_strdup(s->odr, str);
s->z_query = (Z_Query *) odr_malloc(s->odr, sizeof(*s->z_query));
s->z_query->which = Z_Query_type_1;
- s->z_query->u.type_1 = p_query_rpn(s->odr, PROTO_Z3950, str);
+ s->z_query->u.type_1 = p_query_rpn(s->odr, str);
if (!s->z_query->u.type_1)
{
yaz_log(log_details, "%p ZOOM_query_prefix str=%s failed", s, str);
return r;
}
-ZOOM_API(int)
+ZOOM_API(void)
ZOOM_resultset_sort(ZOOM_resultset r,
- const char *sort_type, const char *sort_spec)
+ const char *sort_type, const char *sort_spec)
+{
+ (void) ZOOM_resultset_sort(r, sort_type, sort_spec);
+}
+
+ZOOM_API(int)
+ ZOOM_resultset_sort1(ZOOM_resultset r,
+ const char *sort_type, const char *sort_spec)
{
ZOOM_connection c = r->connection;
ZOOM_task task;
for (i = 0; i<200; i++)
{
size_t len;
+ int *oid;
Z_OtherInformation **oi;
char buf[80];
const char *val;
const char *cp;
- int oidval;
sprintf(buf, "otherInfo%d", i);
val = ZOOM_options_get(c->options, buf);
len = sizeof(buf)-1;
memcpy(buf, val, len);
buf[len] = '\0';
- oidval = oid_getvalbyname(buf);
- if (oidval == VAL_NONE)
+
+ oid = yaz_string_to_oid_odr(yaz_oid_std(), CLASS_USERINFO,
+ buf, out);
+ if (!oid)
continue;
yaz_oi_APDU(a, &oi);
- yaz_oi_set_string_oidval(oi, out, oidval, 1, cp+1);
+ yaz_oi_set_string_oid(oi, out, oid, 1, cp+1);
}
}
assert(a);
if (c->cookie_out)
{
+ const int *oid = yaz_string_to_oid(
+ yaz_oid_std(), CLASS_USERINFO, OID_STR_COOKIE);
Z_OtherInformation **oi;
yaz_oi_APDU(a, &oi);
- yaz_oi_set_string_oidval(oi, out, VAL_COOKIE, 1, c->cookie_out);
+ yaz_oi_set_string_oid(oi, out, oid, 1, c->cookie_out);
}
if (c->client_IP)
{
+ const int *oid = yaz_string_to_oid(
+ yaz_oid_std(), CLASS_USERINFO, OID_STR_CLIENT_IP);
Z_OtherInformation **oi;
yaz_oi_APDU(a, &oi);
- yaz_oi_set_string_oidval(oi, out, VAL_CLIENT_IP, 1, c->client_IP);
+ yaz_oi_set_string_oid(oi, out, oid, 1, c->client_IP);
}
otherInfo_attach(c, a, out);
if (!z_APDU(out, &a, 0, 0))
odr_prepend(c->odr_out, "ZOOM-C",
ireq->implementationName));
- version = odr_strdup(c->odr_out, "$Revision: 1.120 $");
+ version = odr_strdup(c->odr_out, "$Revision: 1.123 $");
if (strlen(version) > 10) /* check for unexpanded CVS strings */
version[strlen(version)-2] = '\0';
ireq->implementationVersion =
ireq->idAuthentication = auth;
}
if (c->proxy)
- yaz_oi_set_string_oidval(&ireq->otherInfo, c->odr_out,
- VAL_PROXY, 1, c->host_port);
+ {
+ const int *oid = yaz_string_to_oid(
+ yaz_oid_std(), CLASS_USERINFO, OID_STR_CLIENT_IP);
+ yaz_oi_set_string_oid(&ireq->otherInfo, c->odr_out,
+ oid, 1, c->host_port);
+ }
if (c->charset || c->lang)
{
Z_OtherInformation **oi;
xfree(c->addinfo);
c->addinfo = 0;
set_dset_error(c, *r->condition,
- yaz_z3950oid_to_str(r->diagnosticSetId, &oclass),
+ yaz_oid_to_string(yaz_oid_std(),
+ r->diagnosticSetId, &oclass),
addinfo, 0);
}
break;
}
if (diagset)
- *diagset = yaz_z3950oid_to_str(ddf->diagnosticSetId, &oclass);
+ *diagset =
+ yaz_oid_to_string(yaz_oid_std(),
+ ddf->diagnosticSetId, &oclass);
}
else
{
if (npr->which == Z_NamePlusRecord_databaseRecord)
{
Z_External *r = (Z_External *) npr->u.databaseRecord;
- oident *ent = oid_getentbyoid(r->direct_reference);
- if (ent)
- desc = ent->desc;
+ desc = yaz_oid_to_string(yaz_oid_std(), r->direct_reference, 0);
}
if (!desc)
desc = "none";
if (!strcmp(type, "render"))
{
Z_External *r = (Z_External *) npr->u.databaseRecord;
- oident *ent = oid_getentbyoid(r->direct_reference);
+ const int *oid = r->direct_reference;
/* render bibliographic record .. */
if (r->which == Z_External_OPAC)
r = r->u.opac->bibliographicRecord;
if (!r)
return 0;
- ent = oid_getentbyoid(r->direct_reference);
+ oid = r->direct_reference;
}
if (r->which == Z_External_sutrs)
return record_iconv_return(rec, len,
charset);
else if (r->which == Z_External_octet)
{
- const char *ret_buf;
- switch (ent->value)
+ if (yaz_oid_is_iso2709(oid))
{
- case VAL_SOIF:
- case VAL_HTML:
- case VAL_SUTRS:
- break;
- case VAL_TEXT_XML:
- case VAL_APPLICATION_XML:
- break;
- default:
- ret_buf = marc_iconv_return(
+ const char *ret_buf = marc_iconv_return(
rec, YAZ_MARC_LINE, len,
(const char *) r->u.octet_aligned->buf,
r->u.octet_aligned->len,
else if (!strcmp(type, "xml"))
{
Z_External *r = (Z_External *) npr->u.databaseRecord;
- oident *ent = oid_getentbyoid(r->direct_reference);
+ const int *oid = r->direct_reference;
/* render bibliographic record .. */
if (r->which == Z_External_OPAC)
r = r->u.opac->bibliographicRecord;
if (!r)
return 0;
- ent = oid_getentbyoid(r->direct_reference);
+ oid = r->direct_reference;
}
if (r->which == Z_External_sutrs)
charset);
else if (r->which == Z_External_octet)
{
- const char *ret_buf;
int marc_decode_type = YAZ_MARC_MARCXML;
-
- switch (ent->value)
+ if (yaz_oid_is_iso2709(oid))
{
- case VAL_SOIF:
- case VAL_HTML:
- case VAL_SUTRS:
- break;
- case VAL_TEXT_XML:
- case VAL_APPLICATION_XML:
- break;
- default:
- ret_buf = marc_iconv_return(
+ const char *ret_buf = marc_iconv_return(
rec, marc_decode_type, len,
(const char *) r->u.octet_aligned->buf,
r->u.octet_aligned->len,
resultset, *start, *count);
/* transfer our response to search_nmem .. we need it later */
- nmem_transfer(resultset->odr->mem, nmem);
+ nmem_transfer(odr_getmem(resultset->odr), nmem);
nmem_destroy(nmem);
if (present_phase && p->num_records == 0)
{
if (res->entries && res->entries->nonsurrogateDiagnostics)
response_diag(c, res->entries->nonsurrogateDiagnostics[0]);
scan->scan_response = res;
- nmem_transfer(scan->odr->mem, nmem);
+ nmem_transfer(odr_getmem(scan->odr), nmem);
if (res->stepSize)
ZOOM_options_set_int(scan->options, "stepSize", *res->stepSize);
if (res->positionOfTerm)
}
ZOOM_API(ZOOM_scanset)
- ZOOM_connection_scan_pqf(ZOOM_connection c, const char *start)
+ ZOOM_connection_scan(ZOOM_connection c, const char *start)
{
ZOOM_scanset s;
ZOOM_query q = ZOOM_query_create();
ZOOM_query_prefix(q, start);
- s = ZOOM_connection_scan(c, q);
+ s = ZOOM_connection_scan1(c, q);
ZOOM_query_destroy(q);
return s;
}
ZOOM_API(ZOOM_scanset)
- ZOOM_connection_scan(ZOOM_connection c, ZOOM_query q)
+ ZOOM_connection_scan1(ZOOM_connection c, ZOOM_query q)
{
char *start;
char *freeme = 0;
return ZOOM_options_get(scan->options, key);
}
-ZOOM_API(int)
+ZOOM_API(void)
ZOOM_scanset_option_set(ZOOM_scanset scan, const char *key,
const char *val)
{
ZOOM_options_set(scan->options, key, val);
- return 0;
}
-static Z_APDU *create_es_package(ZOOM_package p, int type)
+static Z_APDU *create_es_package(ZOOM_package p, const char *type)
{
const char *str;
Z_APDU *apdu = zget_APDU(p->odr_out, Z_APDU_extendedServicesRequest);
str = ZOOM_options_get(p->options, "package-name");
if (str && *str)
- req->packageName = nmem_strdup(p->odr_out->mem, str);
+ req->packageName = odr_strdup(p->odr_out, str);
str = ZOOM_options_get(p->options, "user-id");
if (str)
- req->userId = nmem_strdup(p->odr_out->mem, str);
+ req->userId = odr_strdup(p->odr_out, str);
- req->packageType = yaz_oidval_to_z3950oid(p->odr_out, CLASS_EXTSERV,
- type);
+ req->packageType = yaz_string_to_oid_odr(yaz_oid_std(), CLASS_EXTSERV,
+ type, p->odr_out);
str = ZOOM_options_get(p->options, "function");
if (str)
}
else
{
- oident oid;
int illRequest_size = 0;
char *illRequest_buf = odr_getbuf(out, &illRequest_size, 0);
- oid.proto = PROTO_GENERAL;
- oid.oclass = CLASS_GENERAL;
- oid.value = VAL_ISO_ILL_1;
-
r = (Z_External *) odr_malloc(out, sizeof(*r));
- r->direct_reference = odr_oiddup(out,oid_getoidbyent(&oid));
+ r->direct_reference = yaz_string_to_oid_odr(yaz_oid_std(),
+ CLASS_GENERAL,
+ OID_STR_ILL_1,
+ out);
r->indirect_reference = 0;
r->descriptor = 0;
r->which = Z_External_single;
str = ZOOM_options_get(p->options, "contact-name");
req->u.esRequest->toKeep->contact->name = str ?
- nmem_strdup(p->odr_out->mem, str) : 0;
+ odr_strdup(p->odr_out, str) : 0;
str = ZOOM_options_get(p->options, "contact-phone");
req->u.esRequest->toKeep->contact->phone = str ?
- nmem_strdup(p->odr_out->mem, str) : 0;
+ odr_strdup(p->odr_out, str) : 0;
str = ZOOM_options_get(p->options, "contact-email");
req->u.esRequest->toKeep->contact->email = str ?
- nmem_strdup(p->odr_out->mem, str) : 0;
+ odr_strdup(p->odr_out, str) : 0;
req->u.esRequest->toKeep->addlBilling = 0;
odr_malloc(p->odr_out, sizeof(Z_IOResultSetItem));
req->u.esRequest->notToKeep->resultSetItem->resultSetId =
- nmem_strdup(p->odr_out->mem, str);
+ odr_strdup(p->odr_out, str);
req->u.esRequest->notToKeep->resultSetItem->item =
(int *) odr_malloc(p->odr_out, sizeof(int));
str = ZOOM_options_get(p->options, "doc");
if (str)
+ {
+ const int *oid = yaz_string_to_oid(yaz_oid_std(),
+ CLASS_RECSYN, OID_STR_XML);
req->u.esRequest->notToKeep->itemRequest =
- z_ext_record(p->odr_out, VAL_TEXT_XML, str, strlen(str));
+ z_ext_record_oid(p->odr_out, oid, str, strlen(str));
+ }
else
req->u.esRequest->notToKeep->itemRequest = encode_ill_request(p);
Z_ESAdminOriginPartToKeep **toKeepP,
Z_ESAdminOriginPartNotToKeep **notToKeepP)
{
- Z_APDU *apdu = create_es_package(p, VAL_ADMINSERVICE);
+ Z_APDU *apdu = create_es_package(p, OID_STR_ADMIN);
if (apdu)
{
Z_ESAdminOriginPartToKeep *toKeep;
first_db = db[0];
r->direct_reference =
- yaz_oidval_to_z3950oid(p->odr_out, CLASS_EXTSERV,
- VAL_ADMINSERVICE);
+ yaz_string_to_oid_odr(yaz_oid_std(),
+ CLASS_EXTSERV, OID_STR_ADMIN, p->odr_out);
r->descriptor = 0;
r->indirect_reference = 0;
r->which = Z_External_ESAdmin;
static Z_APDU *create_xmlupdate_package(ZOOM_package p)
{
- Z_APDU *apdu = create_es_package(p, VAL_XMLES);
+ Z_APDU *apdu = create_es_package(p, OID_STR_XMLES);
Z_ExtendedServicesRequest *req = apdu->u.extendedServicesRequest;
Z_External *ext = (Z_External *) odr_malloc(p->odr_out, sizeof(*ext));
const char *doc = ZOOM_options_get(p->options, "doc");
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");
- int syntax_oid = VAL_NONE;
int action_no = -1;
-
- if (syntax_str)
- syntax_oid = oid_getvalbyname(syntax_str);
+ int *syntax_oid = 0;
+
+ if (!syntax_str)
+ syntax_str = "xml";
if (!record_buf)
{
record_buf = "void";
- syntax_oid = VAL_SUTRS;
+ syntax_str = "SUTRS";
}
- if (syntax_oid == VAL_NONE)
- syntax_oid = VAL_TEXT_XML;
-
+
+ if (syntax_str)
+ {
+ syntax_oid = yaz_string_to_oid_odr(yaz_oid_std(),
+ CLASS_RECSYN, syntax_str,
+ p->odr_out);
+ }
+ if (!syntax_oid)
+ return 0;
+
if (num_db > 0)
first_db = db[0];
else
return 0;
- apdu = create_es_package(p, VAL_DBUPDATE);
+ apdu = create_es_package(p, OID_STR_EXT_UPDATE);
if (apdu)
{
Z_IUOriginPartToKeep *toKeep;
odr_malloc(p->odr_out, sizeof(*r));
apdu->u.extendedServicesRequest->taskSpecificParameters = r;
+
r->direct_reference =
- yaz_oidval_to_z3950oid(p->odr_out, CLASS_EXTSERV,
- VAL_DBUPDATE);
+ yaz_string_to_oid_odr(yaz_oid_std(), CLASS_EXTSERV,
+ OID_STR_EXT_UPDATE, p->odr_out);
r->descriptor = 0;
r->which = Z_External_update;
r->indirect_reference = 0;
notToKeep->elements[0]->supplementalId = 0;
notToKeep->elements[0]->correlationInfo = 0;
notToKeep->elements[0]->record =
- z_ext_record(p->odr_out, syntax_oid,
- record_buf, strlen(record_buf));
+ z_ext_record_oid(p->odr_out, syntax_oid,
+ record_buf, strlen(record_buf));
}
if (0 && apdu)
{
p->buf_out = 0;
if (!strcmp(type, "itemorder"))
{
- apdu = create_es_package(p, VAL_ITEMORDER);
+ apdu = create_es_package(p, OID_STR_ITEMORDER);
if (apdu)
{
Z_External *r = (Z_External *) odr_malloc(p->odr_out, sizeof(*r));
r->direct_reference =
- yaz_oidval_to_z3950oid(p->odr_out, CLASS_EXTSERV,
- VAL_ITEMORDER);
+ yaz_string_to_oid_odr(yaz_oid_std(), CLASS_EXTSERV,
+ OID_STR_ITEMORDER, p->odr_out);
r->descriptor = 0;
r->which = Z_External_itemOrder;
r->indirect_reference = 0;
}
-ZOOM_API(int)
+ZOOM_API(void)
ZOOM_package_option_set(ZOOM_package p, const char *key,
const char *val)
{
ZOOM_options_set(p->options, key, val);
- return 0;
}
static int ZOOM_connection_exec_task(ZOOM_connection c)
}
else
{
+ const int *oid = yaz_string_to_oid(yaz_oid_std(),
+ CLASS_USERINFO,
+ OID_STR_COOKIE);
char *cookie =
- yaz_oi_get_string_oidval(&apdu->u.initResponse->otherInfo,
- VAL_COOKIE, 1, 0);
+ yaz_oi_get_string_oid(&apdu->u.initResponse->otherInfo,
+ oid, 1, 0);
xfree(c->cookie_in);
c->cookie_in = 0;
if (cookie)
odr_malloc(c->odr_in, sizeof(Z_External));
npr->u.databaseRecord->descriptor = 0;
npr->u.databaseRecord->direct_reference =
- yaz_oidval_to_z3950oid(c->odr_in, CLASS_RECSYN, VAL_TEXT_XML);
+ yaz_string_to_oid_odr(yaz_oid_std(), CLASS_RECSYN, OID_STR_XML,
+ c->odr_in);
npr->u.databaseRecord->which = Z_External_octet;
npr->u.databaseRecord->u.octet_aligned = (Odr_oct *)
}
}
nmem = odr_extract_mem(c->odr_in);
- nmem_transfer(resultset->odr->mem, nmem);
+ nmem_transfer(odr_getmem(resultset->odr), nmem);
nmem_destroy(nmem);
}
#endif
return ZOOM_options_getl(c->options, key, lenp);
}
-ZOOM_API(int)
+ZOOM_API(void)
ZOOM_connection_option_set(ZOOM_connection c, const char *key,
const char *val)
{
ZOOM_options_set(c->options, key, val);
- return 0;
}
-ZOOM_API(int)
+ZOOM_API(void)
ZOOM_connection_option_setl(ZOOM_connection c, const char *key,
const char *val, int len)
{
ZOOM_options_setl(c->options, key, val, len);
- return 0;
}
ZOOM_API(const char *)
return ZOOM_options_get(r->options, key);
}
-ZOOM_API(int)
+ZOOM_API(void)
ZOOM_resultset_option_set(ZOOM_resultset r, const char *key,
const char *val)
{
ZOOM_options_set(r->options, key, val);
- return 0;
}
}
+static void cql2pqf_wrbuf_puts(const char *buf, void *client_data)
+{
+ WRBUF wrbuf = client_data;
+ wrbuf_puts(wrbuf, buf);
+}
+
/*
* Returns an xmalloc()d string containing RPN that corresponds to the
* CQL passed in. On error, sets the Connection object's error state
{
CQL_parser parser;
int error;
- struct cql_node *node;
const char *cqlfile;
- static cql_transform_t trans;
- char pqfbuf[512];
+ cql_transform_t trans;
+ char *result = 0;
parser = cql_parser_create();
if ((error = cql_parser_string(parser, cql)) != 0) {
return 0;
}
- node = cql_parser_result(parser);
- /* ### Do not call cql_parser_destroy() yet: it destroys `node'! */
-
cqlfile = ZOOM_connection_option_get(c, "cqlfile");
- if (cqlfile == 0) {
- cql_parser_destroy(parser);
- cql_node_destroy(node);
+ if (cqlfile == 0)
+ {
set_ZOOM_error(c, ZOOM_ERROR_CQL_TRANSFORM, "no CQL transform file");
- return 0;
}
-
- if ((trans = cql_transform_open_fname(cqlfile)) == 0) {
+ else if ((trans = cql_transform_open_fname(cqlfile)) == 0)
+ {
char buf[512];
- cql_parser_destroy(parser);
- cql_node_destroy(node);
sprintf(buf, "can't open CQL transform file '%.200s': %.200s",
cqlfile, strerror(errno));
set_ZOOM_error(c, ZOOM_ERROR_CQL_TRANSFORM, buf);
- return 0;
}
-
- error = cql_transform_buf(trans, node, pqfbuf, sizeof pqfbuf);
- cql_parser_destroy(parser);
- cql_node_destroy(node);
- if (error != 0) {
- char buf[512];
- const char *addinfo;
- error = cql_transform_error(trans, &addinfo);
- sprintf(buf, "%.200s (addinfo=%.200s)", cql_strerror(error), addinfo);
- set_ZOOM_error(c, ZOOM_ERROR_CQL_TRANSFORM, buf);
+ else
+ {
+ WRBUF wrbuf_result = wrbuf_alloc();
+ error = cql_transform(trans, cql_parser_result(parser),
+ cql2pqf_wrbuf_puts, wrbuf_result);
+ if (error != 0) {
+ char buf[512];
+ const char *addinfo;
+ error = cql_transform_error(trans, &addinfo);
+ sprintf(buf, "%.200s (addinfo=%.200s)",
+ cql_strerror(error), addinfo);
+ set_ZOOM_error(c, ZOOM_ERROR_CQL_TRANSFORM, buf);
+ }
+ else
+ {
+ result = xstrdup(wrbuf_cstr(wrbuf_result));
+ }
cql_transform_close(trans);
- return 0;
+ wrbuf_destroy(wrbuf_result);
}
-
- cql_transform_close(trans);
- return xstrdup(pqfbuf);
+ cql_parser_destroy(parser);
+ return result;
}
ZOOM_API(int) ZOOM_connection_fire_event_timeout(ZOOM_connection c)