X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=zutil%2Fzoom-c.c;h=8506a269cbba6b8808db1400b7442814ad737f4a;hb=65efc4dd0a947e1b4620d93c88d771b83bc32dac;hp=8c39e90abba35eaa26240b7d0f404e9aad218d58;hpb=9d9bbf2ad72a44772dca1e694de9a84c4e48aa21;p=yaz-moved-to-github.git diff --git a/zutil/zoom-c.c b/zutil/zoom-c.c index 8c39e90..8506a26 100644 --- a/zutil/zoom-c.c +++ b/zutil/zoom-c.c @@ -1,5 +1,8 @@ /* - * $Id: zoom-c.c,v 1.5 2002-10-22 10:05:36 adam Exp $ + * Copyright (c) 2000-2002, Index Data + * See the file LICENSE for details. + * + * $Id: zoom-c.c,v 1.12 2002-12-16 13:13:54 adam Exp $ * * ZOOM layer for C, connections, result sets, queries. */ @@ -8,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -76,6 +80,14 @@ static ZOOM_Event ZOOM_connection_get_event(ZOOM_connection c) return event; } +static void set_bib1_error (ZOOM_connection c, int error) +{ + xfree (c->addinfo); + c->addinfo = 0; + c->error = error; + c->diagset = "Bib-1"; +} + static void clear_error (ZOOM_connection c) { @@ -89,9 +101,7 @@ static void clear_error (ZOOM_connection c) case ZOOM_ERROR_INTERNAL: break; default: - c->error = ZOOM_ERROR_NONE; - xfree (c->addinfo); - c->addinfo = 0; + set_bib1_error(c, ZOOM_ERROR_NONE); } } @@ -168,8 +178,8 @@ ZOOM_connection_create (ZOOM_options options) c->mask = 0; c->reconnect_ok = 0; c->state = STATE_IDLE; - c->error = ZOOM_ERROR_NONE; c->addinfo = 0; + set_bib1_error(c, ZOOM_ERROR_NONE); c->buf_in = 0; c->len_in = 0; c->buf_out = 0; @@ -323,7 +333,7 @@ ZOOM_connection_connect(ZOOM_connection c, c->async = ZOOM_options_get_bool (c->options, "async", 0); - c->error = ZOOM_ERROR_NONE; + set_bib1_error(c, ZOOM_ERROR_NONE); task = ZOOM_connection_add_task (c, ZOOM_TASK_CONNECT); @@ -626,7 +636,7 @@ static zoom_ret do_connect (ZOOM_connection c) } } c->state = STATE_IDLE; - c->error = ZOOM_ERROR_CONNECT; + set_bib1_error(c, ZOOM_ERROR_CONNECT); return zoom_complete; } @@ -705,7 +715,7 @@ static int encode_APDU(ZOOM_connection c, Z_APDU *a, ODR out) odr_destroy(odr_pr); } yaz_log (LOG_DEBUG, "encoding failed"); - c->error = ZOOM_ERROR_ENCODE; + set_bib1_error(c, ZOOM_ERROR_ENCODE); odr_reset(out); return -1; } @@ -961,6 +971,7 @@ static zoom_ret ZOOM_connection_send_search (ZOOM_connection c) static void response_diag (ZOOM_connection c, Z_DiagRec *p) { + int oclass; Z_DefaultDiagFormat *r; char *addinfo = 0; @@ -968,10 +979,12 @@ static void response_diag (ZOOM_connection c, Z_DiagRec *p) c->addinfo = 0; if (p->which != Z_DiagRec_defaultFormat) { - c->error = ZOOM_ERROR_DECODE; + set_bib1_error(c, ZOOM_ERROR_DECODE); return; } r = p->u.defaultFormat; + c->diagset = yaz_z3950oid_to_str(r->diagnosticSetId, &oclass); + switch (r->which) { case Z_DefaultDiagFormat_v2Addinfo: @@ -1054,18 +1067,19 @@ ZOOM_record_get (ZOOM_record rec, const char *type, int *len) } else if (!strcmp (type, "syntax")) { + const char *desc = 0; if (npr->which == Z_NamePlusRecord_databaseRecord) { Z_External *r = (Z_External *) npr->u.databaseRecord; oident *ent = oid_getentbyoid(r->direct_reference); if (ent) - { - if (len) - *len = strlen(ent->desc); - return ent->desc; - } + desc = ent->desc; } - return "none"; + if (!desc) + desc = "none"; + if (len) + *len = strlen(desc); + return desc; } else if (!strcmp (type, "render") && npr->which == Z_NamePlusRecord_databaseRecord) @@ -1080,6 +1094,7 @@ ZOOM_record_get (ZOOM_record rec, const char *type, int *len) } else if (r->which == Z_External_octet) { + yaz_marc_t mt; switch (ent->value) { case VAL_SOIF: @@ -1092,18 +1107,23 @@ ZOOM_record_get (ZOOM_record rec, const char *type, int *len) default: if (!rec->wrbuf_marc) rec->wrbuf_marc = wrbuf_alloc(); + + mt = yaz_marc_create(); wrbuf_rewind (rec->wrbuf_marc); - if (yaz_marc_decode ((const char *) - r->u.octet_aligned->buf, - rec->wrbuf_marc, 0, - r->u.octet_aligned->len, - 0) > 0) + if (yaz_marc_decode_wrbuf ( + mt, (const char *) r->u.octet_aligned->buf, + r->u.octet_aligned->len, + rec->wrbuf_marc) > 0) { - if (len) *len = wrbuf_len(rec->wrbuf_marc); + if (len) + *len = wrbuf_len(rec->wrbuf_marc); + yaz_marc_destroy(mt); return wrbuf_buf(rec->wrbuf_marc); } + yaz_marc_destroy(mt); } - if (len) *len = r->u.octet_aligned->len; + if (len) + *len = r->u.octet_aligned->len; return (const char *) r->u.octet_aligned->buf; } else if (r->which == Z_External_grs1) @@ -1118,8 +1138,8 @@ ZOOM_record_get (ZOOM_record rec, const char *type, int *len) } return 0; } - else if (!strcmp (type, "xml") && - npr->which == Z_NamePlusRecord_databaseRecord) + else if (npr->which == Z_NamePlusRecord_databaseRecord && + (!strcmp (type, "xml") || !strcmp(type, "oai"))) { Z_External *r = (Z_External *) npr->u.databaseRecord; oident *ent = oid_getentbyoid(r->direct_reference); @@ -1131,6 +1151,11 @@ ZOOM_record_get (ZOOM_record rec, const char *type, int *len) } else if (r->which == Z_External_octet) { + yaz_marc_t mt; + int marc_decode_type = YAZ_MARC_MARCXML; + + if (!strcmp(type, "oai")) + marc_decode_type = YAZ_MARC_OAIMARC; switch (ent->value) { case VAL_SOIF: @@ -1144,15 +1169,20 @@ ZOOM_record_get (ZOOM_record rec, const char *type, int *len) if (!rec->wrbuf_marc) rec->wrbuf_marc = wrbuf_alloc(); wrbuf_rewind (rec->wrbuf_marc); - if (yaz_marc_decode ((const char *) - r->u.octet_aligned->buf, - rec->wrbuf_marc, 0, - r->u.octet_aligned->len, - 2) > 0) + mt = yaz_marc_create(); + + yaz_marc_xml(mt, YAZ_MARC_MARCXML); + if (yaz_marc_decode_wrbuf ( + mt, (const char *) r->u.octet_aligned->buf, + r->u.octet_aligned->len, + rec->wrbuf_marc) > 0) { - if (len) *len = wrbuf_len(rec->wrbuf_marc); + if (len) + *len = wrbuf_len(rec->wrbuf_marc); + yaz_marc_destroy(mt); return wrbuf_buf(rec->wrbuf_marc); } + yaz_marc_destroy(mt); } if (len) *len = r->u.octet_aligned->len; return (const char *) r->u.octet_aligned->buf; @@ -1302,7 +1332,7 @@ static void handle_records (ZOOM_connection c, Z_Records *sr, if (sr->u.multipleNonSurDiagnostics->num_diagRecs >= 1) response_diag(c, sr->u.multipleNonSurDiagnostics->diagRecs[0]); else - c->error = ZOOM_ERROR_DECODE; + set_bib1_error(c, ZOOM_ERROR_DECODE); } else { @@ -1333,7 +1363,7 @@ static void handle_records (ZOOM_connection c, Z_Records *sr, else if (present_phase) { /* present response and we didn't get any records! */ - c->error = ZOOM_ERROR_DECODE; + set_bib1_error(c, ZOOM_ERROR_DECODE); } } } @@ -2005,9 +2035,18 @@ static void handle_apdu (ZOOM_connection c, Z_APDU *apdu) { case Z_APDU_initResponse: initrs = apdu->u.initResponse; + ZOOM_connection_option_set(c, "targetImplementationId", + initrs->implementationId ? + initrs->implementationId : ""); + ZOOM_connection_option_set(c, "targetImplementationName", + initrs->implementationName ? + initrs->implementationName : ""); + ZOOM_connection_option_set(c, "targetImplementationVersion", + initrs->implementationVersion ? + initrs->implementationVersion : ""); if (!*initrs->result) { - c->error = ZOOM_ERROR_INIT; + set_bib1_error(c, ZOOM_ERROR_INIT); } else { @@ -2085,12 +2124,12 @@ static void handle_apdu (ZOOM_connection c, Z_APDU *apdu) } else { - c->error = ZOOM_ERROR_CONNECTION_LOST; + set_bib1_error(c, ZOOM_ERROR_CONNECTION_LOST); do_close(c); } break; default: - c->error = ZOOM_ERROR_DECODE; + set_bib1_error(c, ZOOM_ERROR_DECODE); do_close(c); } } @@ -2134,7 +2173,7 @@ static int do_read (ZOOM_connection c) ZOOM_connection_put_event (c, event); if (!z_APDU (c->odr_in, &apdu, 0, 0)) { - c->error = ZOOM_ERROR_DECODE; + set_bib1_error(c, ZOOM_ERROR_DECODE); do_close (c); } else @@ -2165,9 +2204,9 @@ static zoom_ret do_write_ex (ZOOM_connection c, char *buf_out, int len_out) return zoom_complete; } if (c->state == STATE_CONNECTING) - c->error = ZOOM_ERROR_CONNECT; + set_bib1_error(c, ZOOM_ERROR_CONNECT); else - c->error = ZOOM_ERROR_CONNECTION_LOST; + set_bib1_error(c, ZOOM_ERROR_CONNECTION_LOST); do_close (c); return zoom_complete; } @@ -2182,7 +2221,6 @@ static zoom_ret do_write_ex (ZOOM_connection c, char *buf_out, int len_out) } else { - // c->reconnect_ok = 0; c->mask = ZOOM_SELECT_READ|ZOOM_SELECT_EXCEPT; yaz_log (LOG_DEBUG, "do_write_ex 2 mask=%d", c->mask); } @@ -2244,47 +2282,57 @@ ZOOM_connection_addinfo (ZOOM_connection c) return addinfo; } +ZOOM_API(const char *) +ZOOM_diag_str (int error) +{ + switch (error) + { + case ZOOM_ERROR_NONE: + return "No error"; + case ZOOM_ERROR_CONNECT: + return "Connect failed"; + case ZOOM_ERROR_MEMORY: + return "Out of memory"; + case ZOOM_ERROR_ENCODE: + return "Encoding failed"; + case ZOOM_ERROR_DECODE: + return "Decoding failed"; + case ZOOM_ERROR_CONNECTION_LOST: + return "Connection lost"; + case ZOOM_ERROR_INIT: + return "Init rejected"; + case ZOOM_ERROR_INTERNAL: + return "Internal failure"; + case ZOOM_ERROR_TIMEOUT: + return "Timeout"; + default: + return diagbib1_str (error); + } +} + ZOOM_API(int) -ZOOM_connection_error (ZOOM_connection c, const char **cp, - const char **addinfo) +ZOOM_connection_error_x (ZOOM_connection c, const char **cp, + const char **addinfo, const char **diagset) { int error = c->error; if (cp) { - switch (error) - { - case ZOOM_ERROR_NONE: - *cp = "No error"; break; - case ZOOM_ERROR_CONNECT: - *cp = "Connect failed"; break; - case ZOOM_ERROR_MEMORY: - *cp = "Out of memory"; break; - case ZOOM_ERROR_ENCODE: - *cp = "Encoding failed"; break; - case ZOOM_ERROR_DECODE: - *cp = "Decoding failed"; break; - case ZOOM_ERROR_CONNECTION_LOST: - *cp = "Connection lost"; break; - case ZOOM_ERROR_INIT: - *cp = "Init rejected"; break; - case ZOOM_ERROR_INTERNAL: - *cp = "Internal failure"; break; - case ZOOM_ERROR_TIMEOUT: - *cp = "Timeout"; break; - default: - *cp = diagbib1_str (error); - } + *cp = ZOOM_diag_str(error); } if (addinfo) - { - if (c->addinfo) - *addinfo = c->addinfo; - else - *addinfo = ""; - } + *addinfo = c->addinfo ? c->addinfo : ""; + if (diagset) + *diagset = c->diagset ? c->diagset : ""; return c->error; } +ZOOM_API(int) +ZOOM_connection_error (ZOOM_connection c, const char **cp, + const char **addinfo) +{ + return ZOOM_connection_error_x(c, cp, addinfo, 0); +} + static int ZOOM_connection_do_io(ZOOM_connection c, int mask) { ZOOM_Event event = 0; @@ -2295,7 +2343,7 @@ static int ZOOM_connection_do_io(ZOOM_connection c, int mask) if (r == CS_NONE) { event = ZOOM_Event_create (ZOOM_EVENT_CONNECT); - c->error = ZOOM_ERROR_CONNECT; + set_bib1_error(c, ZOOM_ERROR_CONNECT); do_close (c); ZOOM_connection_put_event (c, event); } @@ -2323,7 +2371,7 @@ static int ZOOM_connection_do_io(ZOOM_connection c, int mask) } else { - c->error = ZOOM_ERROR_CONNECT; + set_bib1_error(c, ZOOM_ERROR_CONNECT); do_close (c); ZOOM_connection_put_event (c, event); } @@ -2472,7 +2520,7 @@ ZOOM_event (int no, ZOOM_connection *cs) { ZOOM_Event event = ZOOM_Event_create(ZOOM_EVENT_TIMEOUT); /* timeout and this connection was waiting */ - c->error = ZOOM_ERROR_TIMEOUT; + set_bib1_error(c, ZOOM_ERROR_TIMEOUT); do_close (c); ZOOM_connection_put_event(c, event); } @@ -2508,7 +2556,7 @@ ZOOM_event (int no, ZOOM_connection *cs) { ZOOM_Event event = ZOOM_Event_create(ZOOM_EVENT_TIMEOUT); /* timeout and this connection was waiting */ - c->error = ZOOM_ERROR_TIMEOUT; + set_bib1_error(c, ZOOM_ERROR_TIMEOUT); do_close (c); yaz_log (LOG_DEBUG, "timeout"); ZOOM_connection_put_event(c, event);