X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fzoom-c.c;h=5af33a06f723547a12aa56e126f1b1914b939a12;hb=3b792849c676d96918850e2f1e0af87a75278501;hp=d96d1f55c8e7dc73dc41c613e759265f68c2da09;hpb=f9747584f933039d25a9ba450f362d61733d14ea;p=yaz-moved-to-github.git diff --git a/src/zoom-c.c b/src/zoom-c.c index d96d1f5..5af33a0 100644 --- a/src/zoom-c.c +++ b/src/zoom-c.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2007, Index Data ApS * See the file LICENSE for details. * - * $Id: zoom-c.c,v 1.146 2007-09-08 06:17:45 adam Exp $ + * $Id: zoom-c.c,v 1.151 2007-09-21 16:04:48 adam Exp $ */ /** * \file zoom-c.c @@ -174,6 +174,15 @@ static void set_dset_error(ZOOM_connection c, int error, } } +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) @@ -185,13 +194,7 @@ static void set_SRU_error(ZOOM_connection c, Z_SRW_diagnostic *d) { 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 @@ -396,7 +399,7 @@ ZOOM_API(ZOOM_connection) c->m_queue_front = 0; c->m_queue_back = 0; - c->sru_version = xstrdup("1.1"); + c->sru_version = 0; return c; } @@ -545,7 +548,7 @@ ZOOM_API(void) 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); @@ -1353,7 +1356,7 @@ static zoom_ret ZOOM_connection_send_init(ZOOM_connection c) odr_prepend(c->odr_out, "ZOOM-C", ireq->implementationName)); - version = odr_strdup(c->odr_out, "$Revision: 1.146 $"); + version = odr_strdup(c->odr_out, "$Revision: 1.151 $"); if (strlen(version) > 10) /* check for unexpanded CVS strings */ version[strlen(version)-2] = '\0'; ireq->implementationVersion = @@ -1368,15 +1371,9 @@ static zoom_ret ZOOM_connection_send_init(ZOOM_connection c) 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; @@ -1745,6 +1742,11 @@ ZOOM_API(ZOOM_record) 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; } @@ -1901,6 +1903,7 @@ static const char *record_iconv_return(ZOOM_record rec, int *len, return buf; } + ZOOM_API(int) ZOOM_record_error(ZOOM_record rec, const char **cp, const char **addinfo, const char **diagset) @@ -1909,7 +1912,18 @@ ZOOM_API(int) 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; @@ -2192,54 +2206,58 @@ static size_t record_hash(int pos) static void record_cache_add(ZOOM_resultset r, Z_NamePlusRecord *npr, int pos, const char *syntax, const char *elementSetName, - const char *schema) + 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.schema = schema ? odr_strdup(r->odr, schema) : 0; - 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, @@ -2317,7 +2335,7 @@ static void handle_records(ZOOM_connection c, Z_Records *sr, { record_cache_add(resultset, p->records[i], i + *start, syntax, elementSetName, - elementSetName); + elementSetName, 0); } *count -= i; if (*count < 0) @@ -2336,7 +2354,7 @@ static void handle_records(ZOOM_connection c, Z_Records *sr, Z_NamePlusRecord *myrec = zget_surrogateDiagRec(resultset->odr, 0, 14, 0); record_cache_add(resultset, myrec, *start, - syntax, elementSetName, 0); + syntax, elementSetName, 0, 0); } } else if (present_phase) @@ -2345,7 +2363,7 @@ static void handle_records(ZOOM_connection c, Z_Records *sr, Z_NamePlusRecord *myrec = zget_surrogateDiagRec(resultset->odr, 0, 14, 0); record_cache_add(resultset, myrec, *start, syntax, elementSetName, - 0); + 0, 0); } } } @@ -3023,7 +3041,7 @@ static Z_APDU *create_es_package(ZOOM_package p, const Odr_oid *oid) 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); @@ -3116,16 +3134,16 @@ static Z_ItemOrder *encode_item_order(ZOOM_package p) 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; @@ -3345,9 +3363,7 @@ static Z_APDU *create_update_package(ZOOM_package p) 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); @@ -3383,8 +3399,7 @@ static Z_APDU *create_update_package(ZOOM_package p) 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->note = odr_strdup_null(p->odr_out, correlationInfo_note); ci->id = correlationInfo_id ? odr_intdup(p->odr_out, atoi(correlationInfo_id)) : 0; } @@ -3857,7 +3872,10 @@ static void handle_srw_response(ZOOM_connection c, for (i = 0; inum_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)); @@ -3867,6 +3885,8 @@ static void handle_srw_response(ZOOM_connection c, else pos = *start + i; + sru_rec = &res->records[i]; + npr->databaseName = 0; npr->which = Z_NamePlusRecord_databaseRecord; npr->u.databaseRecord = (Z_External *) @@ -3879,12 +3899,22 @@ static void handle_srw_response(ZOOM_connection c, 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; + 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, - res->records[i].recordSchema); + sru_rec->recordSchema, diag); } if (res->num_diagnostics > 0) set_SRU_error(c, &res->diagnostics[0]);