X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fzoom-c.c;h=320a9258ac94d5bf909b7f53e30e21ad7759e2ad;hb=55ca7cdb58b098d348054917296c0fe2c9cb1580;hp=fb30049d69489b404a133fb178073931e53da886;hpb=b8d35dbb7de11dcfe5bc76fb2a353012baa5b63e;p=yaz-moved-to-github.git diff --git a/src/zoom-c.c b/src/zoom-c.c index fb30049..320a925 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.124 2007-04-13 09:55:41 adam Exp $ + * $Id: zoom-c.c,v 1.127 2007-04-30 08:29:07 adam Exp $ */ /** * \file zoom-c.c @@ -26,6 +26,8 @@ #include #include #include +#include +#include static int log_api = 0; static int log_details = 0; @@ -762,6 +764,7 @@ ZOOM_resultset ZOOM_resultset_create(void) r->next = 0; r->databaseNames = 0; r->num_databaseNames = 0; + r->rpn_iconv = 0; return r; } @@ -792,6 +795,13 @@ ZOOM_API(ZOOM_resultset) r->query = q; r->options = ZOOM_options_create_with_parent(c->options); + + { + const char *cp = ZOOM_options_get(r->options, "rpnCharset"); + if (cp) + r->rpn_iconv = yaz_iconv_open(cp, "UTF-8"); + } + start = ZOOM_options_get_int(r->options, "start", 0); count = ZOOM_options_get_int(r->options, "count", 0); @@ -817,6 +827,8 @@ ZOOM_API(ZOOM_resultset) r->next = c->resultsets; c->resultsets = r; + + if (c->host_port && c->proto == PROTO_HTTP) { if (!c->cs) @@ -858,7 +870,7 @@ ZOOM_API(void) ZOOM_resultset_sort(ZOOM_resultset r, const char *sort_type, const char *sort_spec) { - (void) ZOOM_resultset_sort(r, sort_type, sort_spec); + (void) ZOOM_resultset_sort1(r, sort_type, sort_spec); } ZOOM_API(int) @@ -963,6 +975,8 @@ static void resultset_destroy(ZOOM_resultset r) } ZOOM_query_destroy(r->query); ZOOM_options_destroy(r->options); + if (r->rpn_iconv) + yaz_iconv_close(r->rpn_iconv); odr_destroy(r->odr); xfree(r->setname); xfree(r->schema); @@ -1207,19 +1221,17 @@ static int encode_APDU(ZOOM_connection c, Z_APDU *a, ODR out) 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_oid(oi, out, oid, 1, c->cookie_out); + yaz_oi_set_string_oid(oi, out, yaz_oid_userinfo_cookie, + 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_oid(oi, out, oid, 1, c->client_IP); + yaz_oi_set_string_oid(oi, out, yaz_oid_userinfo_client_ip, + 1, c->client_IP); } otherInfo_attach(c, a, out); if (!z_APDU(out, &a, 0, 0)) @@ -1298,7 +1310,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.124 $"); + version = odr_strdup(c->odr_out, "$Revision: 1.127 $"); if (strlen(version) > 10) /* check for unexpanded CVS strings */ version[strlen(version)-2] = '\0'; ireq->implementationVersion = @@ -1357,10 +1369,8 @@ static zoom_ret ZOOM_connection_send_init(ZOOM_connection c) } if (c->proxy) { - 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); + yaz_oid_userinfo_proxy, 1, c->host_port); } if (c->charset || c->lang) { @@ -1551,7 +1561,13 @@ static zoom_ret ZOOM_connection_send_search(ZOOM_connection c) set_ZOOM_error(c, ZOOM_ERROR_INVALID_QUERY, 0); return zoom_complete; } - + if (r->query->z_query->which == Z_Query_type_1 && r->rpn_iconv) + { + search_req->query = yaz_copy_Z_Query(r->query->z_query, c->odr_out); + + yaz_query_charset_convert_rpnquery(search_req->query->u.type_1, + c->odr_out, r->rpn_iconv); + } search_req->databaseNames = r->databaseNames; search_req->num_databaseNames = r->num_databaseNames; @@ -2688,6 +2704,20 @@ ZOOM_API(ZOOM_scanset) p_query_scan(scan->odr, PROTO_Z3950, &scan->attributeSet, start); xfree(freeme); + { + const char *cp = ZOOM_options_get(scan->options, "rpnCharset"); + if (cp) + { + yaz_iconv_t cd = yaz_iconv_open(cp, "UTF-8"); + if (cd) + { + yaz_query_charset_convert_apt(scan->termListAndStartPoint, + scan->odr, cd); + } + } + } + + scan->databaseNames = set_DatabaseNames(c, c->options, &scan->num_databaseNames, scan->odr); @@ -2849,7 +2879,7 @@ ZOOM_API(void) ZOOM_options_set(scan->options, key, val); } -static Z_APDU *create_es_package(ZOOM_package p, const char *type) +static Z_APDU *create_es_package(ZOOM_package p, const int *oid) { const char *str; Z_APDU *apdu = zget_APDU(p->odr_out, Z_APDU_extendedServicesRequest); @@ -2865,8 +2895,7 @@ static Z_APDU *create_es_package(ZOOM_package p, const char *type) if (str) req->userId = odr_strdup(p->odr_out, str); - req->packageType = yaz_string_to_oid_odr(yaz_oid_std(), CLASS_EXTSERV, - type, p->odr_out); + req->packageType = odr_oiddup(p->odr_out, oid); str = ZOOM_options_get(p->options, "function"); if (str) @@ -2914,10 +2943,7 @@ static Z_External *encode_ill_request(ZOOM_package p) char *illRequest_buf = odr_getbuf(out, &illRequest_size, 0); r = (Z_External *) odr_malloc(out, sizeof(*r)); - r->direct_reference = yaz_string_to_oid_odr(yaz_oid_std(), - CLASS_GENERAL, - OID_STR_ILL_1, - out); + r->direct_reference = odr_oiddup(out, yaz_oid_general_isoill_1); r->indirect_reference = 0; r->descriptor = 0; r->which = Z_External_single; @@ -3001,7 +3027,7 @@ Z_APDU *create_admin_package(ZOOM_package p, int type, Z_ESAdminOriginPartToKeep **toKeepP, Z_ESAdminOriginPartNotToKeep **notToKeepP) { - Z_APDU *apdu = create_es_package(p, OID_STR_ADMIN); + Z_APDU *apdu = create_es_package(p, yaz_oid_extserv_admin); if (apdu) { Z_ESAdminOriginPartToKeep *toKeep; @@ -3014,9 +3040,7 @@ Z_APDU *create_admin_package(ZOOM_package p, int type, if (num_db > 0) first_db = db[0]; - r->direct_reference = - yaz_string_to_oid_odr(yaz_oid_std(), - CLASS_EXTSERV, OID_STR_ADMIN, p->odr_out); + r->direct_reference = odr_oiddup(p->odr_out, yaz_oid_extserv_admin); r->descriptor = 0; r->indirect_reference = 0; r->which = Z_External_ESAdmin; @@ -3051,7 +3075,7 @@ Z_APDU *create_admin_package(ZOOM_package p, int type, static Z_APDU *create_xmlupdate_package(ZOOM_package p) { - Z_APDU *apdu = create_es_package(p, OID_STR_XMLES); + 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"); @@ -3121,7 +3145,7 @@ static Z_APDU *create_update_package(ZOOM_package p) else return 0; - apdu = create_es_package(p, OID_STR_EXT_UPDATE); + apdu = create_es_package(p, yaz_oid_extserv_database_update); if (apdu) { Z_IUOriginPartToKeep *toKeep; @@ -3132,9 +3156,8 @@ static Z_APDU *create_update_package(ZOOM_package p) apdu->u.extendedServicesRequest->taskSpecificParameters = r; - r->direct_reference = - yaz_string_to_oid_odr(yaz_oid_std(), CLASS_EXTSERV, - OID_STR_EXT_UPDATE, p->odr_out); + r->direct_reference = odr_oiddup(p->odr_out, + yaz_oid_extserv_database_update); r->descriptor = 0; r->which = Z_External_update; r->indirect_reference = 0; @@ -3208,14 +3231,13 @@ ZOOM_API(void) p->buf_out = 0; if (!strcmp(type, "itemorder")) { - apdu = create_es_package(p, OID_STR_ITEMORDER); + apdu = create_es_package(p, yaz_oid_extserv_item_order); if (apdu) { Z_External *r = (Z_External *) odr_malloc(p->odr_out, sizeof(*r)); - r->direct_reference = - yaz_string_to_oid_odr(yaz_oid_std(), CLASS_EXTSERV, - OID_STR_ITEMORDER, p->odr_out); + r->direct_reference = + odr_oiddup(p->odr_out, yaz_oid_extserv_item_order); r->descriptor = 0; r->which = Z_External_itemOrder; r->indirect_reference = 0; @@ -3509,12 +3531,9 @@ static void recv_apdu(ZOOM_connection c, Z_APDU *apdu) } else { - const int *oid = yaz_string_to_oid(yaz_oid_std(), - CLASS_USERINFO, - OID_STR_COOKIE); char *cookie = yaz_oi_get_string_oid(&apdu->u.initResponse->otherInfo, - oid, 1, 0); + yaz_oid_userinfo_cookie, 1, 0); xfree(c->cookie_in); c->cookie_in = 0; if (cookie) @@ -3662,8 +3681,7 @@ static void handle_srw_response(ZOOM_connection c, odr_malloc(c->odr_in, sizeof(Z_External)); npr->u.databaseRecord->descriptor = 0; npr->u.databaseRecord->direct_reference = - yaz_string_to_oid_odr(yaz_oid_std(), CLASS_RECSYN, OID_STR_XML, - c->odr_in); + odr_oiddup(c->odr_in, yaz_oid_recsyn_xml); npr->u.databaseRecord->which = Z_External_octet; npr->u.databaseRecord->u.octet_aligned = (Odr_oct *)