X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fzoom-c.c;h=65d14ab93bfe9d94e107abdc6a3fc35f2c6df030;hb=f6379872ace49628473c47d23b29e9f46b5afbe4;hp=0235bd40cc10e27a2751fd1a7dcf281dc62dd30f;hpb=f9e10939c4e5ac6cc0dd42587cc51c7fa7fa0007;p=yaz-moved-to-github.git diff --git a/src/zoom-c.c b/src/zoom-c.c index 0235bd4..65d14ab 100644 --- a/src/zoom-c.c +++ b/src/zoom-c.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2006, Index Data ApS * See the file LICENSE for details. * - * $Id: zoom-c.c,v 1.93 2006-10-26 15:34:46 adam Exp $ + * $Id: zoom-c.c,v 1.101 2006-12-06 11:12:14 mike Exp $ */ /** * \file zoom-c.c @@ -193,6 +193,33 @@ static void clear_error(ZOOM_connection c) } } +void ZOOM_connection_show_task(ZOOM_task task) +{ + switch(task->which) + { + case ZOOM_TASK_SEARCH: + yaz_log(YLOG_LOG, "search p=%p", task); + break; + case ZOOM_TASK_RETRIEVE: + yaz_log(YLOG_LOG, "retrieve p=%p", task); + break; + case ZOOM_TASK_CONNECT: + yaz_log(YLOG_LOG, "connect p=%p", task); + break; + case ZOOM_TASK_SCAN: + yaz_log(YLOG_LOG, "scant p=%p", task); + break; + } +} + +void ZOOM_connection_show_tasks(ZOOM_connection c) +{ + ZOOM_task task; + yaz_log(YLOG_LOG, "connection p=%p tasks", c); + for (task = c->tasks; task; task = task->next) + ZOOM_connection_show_task(task); +} + ZOOM_task ZOOM_connection_add_task(ZOOM_connection c, int which) { ZOOM_task *taskp = &c->tasks; @@ -332,7 +359,7 @@ ZOOM_API(ZOOM_connection) /* set database names. Take local databases (if set); otherwise take databases given in ZURL (if set); otherwise use Default */ static char **set_DatabaseNames(ZOOM_connection con, ZOOM_options options, - int *num) + int *num, ODR odr) { char **databaseNames; const char *cp = ZOOM_options_get(options, "databaseName"); @@ -348,7 +375,7 @@ static char **set_DatabaseNames(ZOOM_connection con, ZOOM_options options, } if (!cp) cp = "Default"; - nmem_strsplit(con->odr_out->mem, "+", cp, &databaseNames, num); + nmem_strsplit(odr->mem, "+", cp, &databaseNames, num); return databaseNames; } @@ -426,9 +453,6 @@ ZOOM_API(void) else c->lang = 0; - val = ZOOM_options_get(c->options, "sru"); - c->sru_mode = get_sru_mode_from_string(val); - xfree(c->host_port); if (portnum) { @@ -470,6 +494,9 @@ ZOOM_API(void) } } + val = ZOOM_options_get(c->options, "sru"); + c->sru_mode = get_sru_mode_from_string(val); + ZOOM_options_set(c->options, "host", c->host_port); val = ZOOM_options_get(c->options, "cookie"); @@ -710,6 +737,8 @@ ZOOM_resultset ZOOM_resultset_create(void) r->query = 0; r->connection = 0; r->next = 0; + r->databaseNames = 0; + r->num_databaseNames = 0; return r; } @@ -756,6 +785,9 @@ ZOOM_API(ZOOM_resultset) cp = ZOOM_options_get(r->options, "schema"); if (cp) r->schema = xstrdup(cp); + + r->databaseNames = set_DatabaseNames(c, c->options, &r->num_databaseNames, + r->odr); r->connection = c; @@ -918,6 +950,8 @@ ZOOM_API(void) ZOOM_API(size_t) ZOOM_resultset_size(ZOOM_resultset r) { + yaz_log(log_details, "ZOOM_resultset_size r=%p count=%d", + r, r->size); return r->size; } @@ -1242,7 +1276,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.93 $"); + version = odr_strdup(c->odr_out, "$Revision: 1.101 $"); if (strlen(version) > 10) /* check for unexpanded CVS strings */ version[strlen(version)-2] = '\0'; ireq->implementationVersion = @@ -1492,8 +1526,8 @@ static zoom_ret ZOOM_connection_send_search(ZOOM_connection c) return zoom_complete; } - search_req->databaseNames = - set_DatabaseNames(c, r->options, &search_req->num_databaseNames); + search_req->databaseNames = r->databaseNames; + search_req->num_databaseNames = r->num_databaseNames; /* get syntax (no need to provide unless piggyback is in effect) */ syntax = c->tasks->u.search.syntax; @@ -1802,6 +1836,53 @@ 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) +{ + Z_NamePlusRecord *npr; + + if (!rec) + return 0; + npr = rec->npr; + if (npr && npr->which == Z_NamePlusRecord_surrogateDiagnostic) + { + Z_DiagRec *diag_rec = npr->u.surrogateDiagnostic; + int error = YAZ_BIB1_UNSPECIFIED_ERROR; + const char *add = 0; + + if (diag_rec->which == Z_DiagRec_defaultFormat) + { + Z_DefaultDiagFormat *ddf = diag_rec->u.defaultFormat; + int oclass; + + error = *ddf->condition; + switch (ddf->which) + { + case Z_DefaultDiagFormat_v2Addinfo: + add = ddf->u.v2Addinfo; + break; + case Z_DefaultDiagFormat_v3Addinfo: + add = ddf->u.v3Addinfo; + break; + } + if (diagset) + *diagset = yaz_z3950oid_to_str(ddf->diagnosticSetId, &oclass); + } + else + { + if (diagset) + *diagset = "Bib-1"; + } + if (addinfo) + *addinfo = add ? add : ""; + if (cp) + *cp = diagbib1_str(error); + return error; + } + return 0; +} + ZOOM_API(const char *) ZOOM_record_get(ZOOM_record rec, const char *type_spec, int *len) { @@ -2427,15 +2508,6 @@ static zoom_ret send_present(ZOOM_connection c) count = &c->tasks->u.retrieve.count; syntax = c->tasks->u.retrieve.syntax; elementSetName = c->tasks->u.retrieve.elementSetName; - - if (*start >= resultset->size) - { - yaz_log(log_details, "%p send_present start=%d >= size=%d", - c, *start, resultset->size); - return zoom_complete; - } - if (*start + *count > resultset->size) - *count = resultset->size - *start; break; default: return zoom_complete; @@ -2443,10 +2515,13 @@ static zoom_ret send_present(ZOOM_connection c) yaz_log(log_details, "%p send_present start=%d count=%d", c, *start, *count); + if (*start < 0 || *count < 0 || *start + *count > resultset->size) + { + set_dset_error(c, YAZ_BIB1_PRESENT_REQUEST_OUT_OF_RANGE, "Bib-1", + "", 0); + } if (c->error) /* don't continue on error */ return zoom_complete; - if (*start < 0) - return zoom_complete; yaz_log(log_details, "send_present resultset=%p start=%d count=%d", resultset, *start, *count); @@ -2598,7 +2673,7 @@ ZOOM_API(ZOOM_scanset) c, q, q->query_string); abort(); } - + scan = (ZOOM_scanset) xmalloc(sizeof(*scan)); scan->connection = c; scan->odr = odr_createmem(ODR_DECODE); @@ -2608,6 +2683,10 @@ ZOOM_API(ZOOM_scanset) scan->termListAndStartPoint = p_query_scan(scan->odr, PROTO_Z3950, &scan->attributeSet, start); xfree(freeme); + + scan->databaseNames = set_DatabaseNames(c, c->options, + &scan->num_databaseNames, + scan->odr); if (scan->termListAndStartPoint != 0) { ZOOM_task task = ZOOM_connection_add_task(c, ZOOM_TASK_SCAN); @@ -2682,8 +2761,8 @@ static zoom_ret send_scan(ZOOM_connection c) odr_intdup(c->odr_out, ZOOM_options_get_int(scan->options, "stepSize", 0)); - req->databaseNames = set_DatabaseNames(c, scan->options, - &req->num_databaseNames); + req->databaseNames = scan->databaseNames; + req->num_databaseNames = scan->num_databaseNames; return send_APDU(c, apdu); } @@ -2920,7 +2999,8 @@ Z_APDU *create_admin_package(ZOOM_package p, int type, Z_External *r = (Z_External *) odr_malloc(p->odr_out, sizeof(*r)); const char *first_db = "Default"; int num_db; - char **db = set_DatabaseNames(p->connection, p->options, &num_db); + char **db = set_DatabaseNames(p->connection, p->options, &num_db, + p->odr_out); if (num_db > 0) first_db = db[0]; @@ -2986,7 +3066,7 @@ static Z_APDU *create_update_package(ZOOM_package p) Z_APDU *apdu = 0; const char *first_db = "Default"; int num_db; - char **db = set_DatabaseNames(p->connection, p->options, &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"); const char *recordIdNumber = ZOOM_options_get(p->options, "recordIdNumber"); @@ -3356,6 +3436,16 @@ static void interpret_otherinformation_field(ZOOM_connection c, } } + +static void set_init_option(const char *name, void *clientData) { + ZOOM_connection c = clientData; + char buf[80]; + + sprintf(buf, "init_opt_%.70s", name); + ZOOM_connection_option_set(c, buf, "1"); +} + + static void recv_apdu(ZOOM_connection c, Z_APDU *apdu) { Z_InitResponse *initrs; @@ -3386,6 +3476,10 @@ static void recv_apdu(ZOOM_connection c, Z_APDU *apdu) ZOOM_connection_option_set(c, "targetImplementationVersion", initrs->implementationVersion ? initrs->implementationVersion : ""); + + /* Make initrs->options available as ZOOM-level options */ + yaz_init_opt_decode(initrs->options, set_init_option, (void*) c); + if (!*initrs->result) { Z_External *uif = initrs->userInformationField; @@ -3995,10 +4089,17 @@ ZOOM_API(int) int max_fd = 0; yaz_log(log_details, "ZOOM_event(no=%d,cs=%p)", no, cs); + for (i = 0; i