* Copyright (C) 1995-2007, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: zoom-c.c,v 1.145 2007-09-06 12:40:53 mike Exp $
+ * $Id: zoom-c.c,v 1.153 2007-12-11 13:35:45 adam Exp $
*/
/**
* \file zoom-c.c
* 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) {
+ oid_class oid_class, const char *str) {
Odr_oid *res = yaz_string_to_oid_odr(yaz_oid_std(), oid_class, str,
c->odr_out);
if (res == 0)
}
}
+static int uri_to_code(const char *uri)
+{
+ int code = 0;
+ const char *cp;
+ if ((cp = strrchr(uri, '/')))
+ code = atoi(cp+1);
+ return code;
+}
+
#if YAZ_HAVE_XML2
static void set_HTTP_error(ZOOM_connection c, int error,
const char *addinfo, const char *addinfo2)
{
const char *uri = d->uri;
if (uri)
- {
- int code = 0;
- const char *cp;
- if ((cp = strrchr(uri, '/')))
- code = atoi(cp+1);
- set_dset_error(c, code, uri, d->details, 0);
- }
+ set_dset_error(c, uri_to_code(uri), uri, d->details, 0);
}
#endif
c->m_queue_front = 0;
c->m_queue_back = 0;
- c->sru_version = xstrdup("1.1");
+ c->sru_version = 0;
return c;
}
xfree(c->sru_version);
val = ZOOM_options_get(c->options, "sru_version");
- c->sru_version = xstrdup(val ? val : "1.1");
+ c->sru_version = xstrdup(val ? val : "1.2");
ZOOM_options_set(c->options, "host", c->host_port);
odr_prepend(c->odr_out, "ZOOM-C",
ireq->implementationName));
- version = odr_strdup(c->odr_out, "$Revision: 1.145 $");
+ version = odr_strdup(c->odr_out, "$Revision: 1.153 $");
if (strlen(version) > 10) /* check for unexpanded CVS strings */
version[strlen(version)-2] = '\0';
ireq->implementationVersion =
if (c->group || c->password)
{
Z_IdPass *pass = (Z_IdPass *) odr_malloc(c->odr_out, sizeof(*pass));
- pass->groupId = 0;
- if (c->group)
- pass->groupId = odr_strdup(c->odr_out, c->group);
- pass->userId = 0;
- if (c->user)
- pass->userId = odr_strdup(c->odr_out, c->user);
- pass->password = 0;
- if (c->password)
- pass->password = odr_strdup(c->odr_out, c->password);
+ pass->groupId = odr_strdup_null(c->odr_out, c->group);
+ pass->userId = odr_strdup_null(c->odr_out, c->user);
+ pass->password = odr_strdup_null(c->odr_out, c->password);
auth->which = Z_IdAuthentication_idPass;
auth->u.idPass = pass;
ireq->idAuthentication = auth;
odr_setbuf(nrec->odr, buf, size, 0);
z_NamePlusRecord(nrec->odr, &nrec->npr, 0, 0);
+ nrec->schema = odr_strdup_null(nrec->odr, srec->schema);
+ nrec->diag_uri = odr_strdup_null(nrec->odr, srec->diag_uri);
+ nrec->diag_message = odr_strdup_null(nrec->odr, srec->diag_message);
+ nrec->diag_details = odr_strdup_null(nrec->odr, srec->diag_details);
+ nrec->diag_set = odr_strdup_null(nrec->odr, srec->diag_set);
odr_destroy(odr_enc);
return nrec;
}
return buf;
}
+
ZOOM_API(int)
ZOOM_record_error(ZOOM_record rec, const char **cp,
const char **addinfo, const char **diagset)
if (!rec)
return 0;
+
npr = rec->npr;
+ if (rec->diag_uri)
+ {
+ if (cp)
+ *cp = rec->diag_message;
+ if (addinfo)
+ *addinfo = rec->diag_details;
+ if (diagset)
+ *diagset = rec->diag_set;
+ return uri_to_code(rec->diag_uri);
+ }
if (npr && npr->which == Z_NamePlusRecord_surrogateDiagnostic)
{
Z_DiagRec *diag_rec = npr->u.surrogateDiagnostic;
*len = (npr->databaseName ? strlen(npr->databaseName) : 0);
return npr->databaseName;
}
+ else if (!strcmp(type, "schema"))
+ {
+ if (len)
+ *len = rec->schema ? strlen(rec->schema) : 0;
+ return rec->schema;
+ }
else if (!strcmp(type, "syntax"))
{
const char *desc = 0;
static void record_cache_add(ZOOM_resultset r, Z_NamePlusRecord *npr,
int pos,
- const char *syntax, const char *elementSetName)
+ const char *syntax, const char *elementSetName,
+ const char *schema,
+ Z_SRW_diagnostic *diag)
{
- ZOOM_record_cache rc;
+ ZOOM_record_cache rc = 0;
ZOOM_Event event = ZOOM_Event_create(ZOOM_EVENT_RECV_RECORD);
ZOOM_connection_put_event(r->connection, event);
for (rc = r->record_hash[record_hash(pos)]; rc; rc = rc->next)
{
- if (pos == rc->pos)
+ if (pos == rc->pos
+ && strcmp_null(r->schema, rc->schema) == 0
+ && strcmp_null(elementSetName,rc->elementSetName) == 0
+ && strcmp_null(syntax, rc->syntax) == 0)
+ break;
+ }
+ if (!rc)
+ {
+ rc = (ZOOM_record_cache) odr_malloc(r->odr, sizeof(*rc));
+ rc->rec.odr = 0;
+ rc->rec.wrbuf_marc = 0;
+ rc->rec.wrbuf_iconv = 0;
+ rc->rec.wrbuf_opac = 0;
+ rc->elementSetName = odr_strdup_null(r->odr, elementSetName);
+
+ rc->syntax = odr_strdup_null(r->odr, syntax);
+
+ rc->schema = odr_strdup_null(r->odr, r->schema);
+
+ rc->pos = pos;
+ rc->next = r->record_hash[record_hash(pos)];
+ r->record_hash[record_hash(pos)] = rc;
+ }
+ rc->rec.npr = npr;
+ rc->rec.schema = odr_strdup_null(r->odr, schema);
+ rc->rec.diag_set = 0;
+ rc->rec.diag_uri = 0;
+ rc->rec.diag_message = 0;
+ rc->rec.diag_details = 0;
+ if (diag)
+ {
+ if (diag->uri)
{
- if (strcmp_null(r->schema, rc->schema))
- continue;
- if (strcmp_null(elementSetName,rc->elementSetName))
- continue;
- if (strcmp_null(syntax, rc->syntax))
- continue;
- /* not destroying rc->npr (it's handled by nmem )*/
- rc->rec.npr = npr;
- /* keeping wrbuf_marc too */
- return;
+ char *cp;
+ rc->rec.diag_set = odr_strdup(r->odr, diag->uri);
+ if ((cp = strrchr(rc->rec.diag_set, '/')))
+ *cp = '\0';
+ rc->rec.diag_uri = odr_strdup(r->odr, diag->uri);
}
+ rc->rec.diag_message = odr_strdup_null(r->odr, diag->message);
+ rc->rec.diag_details = odr_strdup_null(r->odr, diag->details);
}
- rc = (ZOOM_record_cache) odr_malloc(r->odr, sizeof(*rc));
- rc->rec.npr = npr;
- rc->rec.odr = 0;
- rc->rec.wrbuf_marc = 0;
- rc->rec.wrbuf_iconv = 0;
- rc->rec.wrbuf_opac = 0;
- if (elementSetName)
- rc->elementSetName = odr_strdup(r->odr, elementSetName);
- else
- rc->elementSetName = 0;
-
- if (syntax)
- rc->syntax = odr_strdup(r->odr, syntax);
- else
- rc->syntax = 0;
-
- if (r->schema)
- rc->schema = odr_strdup(r->odr, r->schema);
- else
- rc->schema = 0;
-
- rc->pos = pos;
- rc->next = r->record_hash[record_hash(pos)];
- r->record_hash[record_hash(pos)] = rc;
}
static ZOOM_record record_cache_lookup(ZOOM_resultset r, int pos,
for (i = 0; i<p->num_records; i++)
{
record_cache_add(resultset, p->records[i], i + *start,
- syntax, elementSetName);
+ syntax, elementSetName,
+ elementSetName, 0);
}
*count -= i;
if (*count < 0)
Z_NamePlusRecord *myrec =
zget_surrogateDiagRec(resultset->odr, 0, 14, 0);
record_cache_add(resultset, myrec, *start,
- syntax, elementSetName);
+ syntax, elementSetName, 0, 0);
}
}
else if (present_phase)
/* present response and we didn't get any records! */
Z_NamePlusRecord *myrec =
zget_surrogateDiagRec(resultset->odr, 0, 14, 0);
- record_cache_add(resultset, myrec, *start, syntax, elementSetName);
+ record_cache_add(resultset, myrec, *start, syntax, elementSetName,
+ 0, 0);
}
}
}
str = ZOOM_options_get(p->options, "user-id");
if (str)
- req->userId = odr_strdup(p->odr_out, str);
+ req->userId = odr_strdup_null(p->odr_out, str);
req->packageType = odr_oiddup(p->odr_out, oid);
{
Z_ItemOrder *req = (Z_ItemOrder *) odr_malloc(p->odr_out, sizeof(*req));
const char *str;
+ int len;
req->which = Z_IOItemOrder_esRequest;
req->u.esRequest = (Z_IORequest *)
odr_malloc(p->odr_out, sizeof(*req->u.esRequest->toKeep->contact));
str = ZOOM_options_get(p->options, "contact-name");
- req->u.esRequest->toKeep->contact->name = str ?
- odr_strdup(p->odr_out, str) : 0;
+ req->u.esRequest->toKeep->contact->name =
+ odr_strdup_null(p->odr_out, str);
str = ZOOM_options_get(p->options, "contact-phone");
- req->u.esRequest->toKeep->contact->phone = str ?
- odr_strdup(p->odr_out, str) : 0;
+ req->u.esRequest->toKeep->contact->phone =
+ odr_strdup_null(p->odr_out, str);
str = ZOOM_options_get(p->options, "contact-email");
- req->u.esRequest->toKeep->contact->email = str ?
- odr_strdup(p->odr_out, str) : 0;
+ req->u.esRequest->toKeep->contact->email =
+ odr_strdup_null(p->odr_out, str);
req->u.esRequest->toKeep->addlBilling = 0;
(str ? atoi(str) : 1);
}
- str = ZOOM_options_get(p->options, "doc");
+ str = ZOOM_options_getl(p->options, "doc", &len);
if (str)
{
req->u.esRequest->notToKeep->itemRequest =
- z_ext_record_xml(p->odr_out, str, strlen(str));
+ z_ext_record_xml(p->odr_out, str, len);
}
else
req->u.esRequest->notToKeep->itemRequest = encode_ill_request(p);
Z_APDU *apdu = create_es_package(p, yaz_oid_extserv_xml_es);
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");
+ int len;
+ const char *doc = ZOOM_options_getl(p->options, "doc", &len);
if (!doc)
+ {
doc = "";
+ len = 0;
+ }
req->taskSpecificParameters = ext;
ext->direct_reference = req->packageType;
ext->which = Z_External_octet;
ext->u.single_ASN1_type =
- odr_create_Odr_oct(p->odr_out, (const unsigned char *) doc,
- strlen(doc));
+ odr_create_Odr_oct(p->odr_out, (const unsigned char *) doc, len);
return apdu;
}
int num_db;
char **db = set_DatabaseNames(p->connection, p->options, &num_db, p->odr_out);
const char *action = ZOOM_options_get(p->options, "action");
- const char *recordIdOpaque = ZOOM_options_get(p->options, "recordIdOpaque");
+ int recordIdOpaque_len;
+ const char *recordIdOpaque = ZOOM_options_getl(p->options, "recordIdOpaque",
+ &recordIdOpaque_len);
const char *recordIdNumber = ZOOM_options_get(p->options, "recordIdNumber");
- const char *record_buf = ZOOM_options_get(p->options, "record");
+ int record_len;
+ const char *record_buf = ZOOM_options_getl(p->options, "record",
+ &record_len);
const char *syntax_str = ZOOM_options_get(p->options, "syntax");
const char *version = ZOOM_options_get(p->options, "updateVersion");
if (!record_buf)
{
record_buf = "void";
+ record_len = 4;
syntax_str = "SUTRS";
}
toKeep->databaseName = odr_strdup(p->odr_out, first_db);
toKeep->schema = 0;
- toKeep->elementSetName = 0;
- if (elementSetName)
- toKeep->elementSetName = odr_strdup(p->odr_out, elementSetName);
+ toKeep->elementSetName = odr_strdup_null(p->odr_out, elementSetName);
toKeep->actionQualifier = 0;
toKeep->action = odr_intdup(p->odr_out, action_no);
notToKeep->elements[0]->u.opaque =
odr_create_Odr_oct(p->odr_out,
(const unsigned char *) recordIdOpaque,
- strlen(recordIdOpaque));
+ recordIdOpaque_len);
}
else if (recordIdNumber)
{
{
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;
+ (Z_IUCorrelationInfo *) odr_malloc(p->odr_out, sizeof(*ci));
+ ci->note = odr_strdup_null(p->odr_out, correlationInfo_note);
ci->id = correlationInfo_id ?
odr_intdup(p->odr_out, atoi(correlationInfo_id)) : 0;
}
notToKeep->elements[0]->correlationInfo = 0;
notToKeep->elements[0]->record =
z_ext_record_oid(p->odr_out, syntax_oid,
- record_buf, strlen(record_buf));
+ record_buf, record_len);
}
if (0 && apdu)
{
return ZOOM_options_get(p->options, key);
}
+ZOOM_API(const char *)
+ ZOOM_package_option_getl(ZOOM_package p, const char *key, int *lenp)
+{
+ return ZOOM_options_getl(p->options, key, lenp);
+}
ZOOM_API(void)
ZOOM_package_option_set(ZOOM_package p, const char *key,
ZOOM_options_set(p->options, key, val);
}
+ZOOM_API(void)
+ ZOOM_package_option_setl(ZOOM_package p, const char *key,
+ const char *val, int len)
+{
+ ZOOM_options_setl(p->options, key, val, len);
+}
+
static int ZOOM_connection_exec_task(ZOOM_connection c)
{
ZOOM_task task = c->tasks;
for (i = 0; i<res->num_records; i++)
{
int pos;
-
+ Z_SRW_record *sru_rec;
+ Z_SRW_diagnostic *diag = 0;
+ int num_diag;
+
Z_NamePlusRecord *npr = (Z_NamePlusRecord *)
odr_malloc(c->odr_in, sizeof(Z_NamePlusRecord));
else
pos = *start + i;
+ sru_rec = &res->records[i];
+
npr->databaseName = 0;
npr->which = Z_NamePlusRecord_databaseRecord;
npr->u.databaseRecord = (Z_External *)
npr->u.databaseRecord->u.octet_aligned = (Odr_oct *)
odr_malloc(c->odr_in, sizeof(Odr_oct));
npr->u.databaseRecord->u.octet_aligned->buf = (unsigned char*)
- res->records[i].recordData_buf;
+ sru_rec->recordData_buf;
npr->u.databaseRecord->u.octet_aligned->len =
npr->u.databaseRecord->u.octet_aligned->size =
- res->records[i].recordData_len;
- record_cache_add(resultset, npr, pos, syntax, elementSetName);
+ sru_rec->recordData_len;
+
+ if (sru_rec->recordSchema
+ && !strcmp(sru_rec->recordSchema,
+ "info:srw/schema/1/diagnostics-v1.1"))
+ {
+ sru_decode_surrogate_diagnostics(sru_rec->recordData_buf,
+ sru_rec->recordData_len,
+ &diag, &num_diag,
+ resultset->odr);
+ }
+ record_cache_add(resultset, npr, pos, syntax, elementSetName,
+ sru_rec->recordSchema, diag);
}
if (res->num_diagnostics > 0)
set_SRU_error(c, &res->diagnostics[0]);