X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;ds=sidebyside;f=src%2Fzoom-c.c;h=bf4beb0913d63bd7f46a05595e365cdf9931f5ce;hb=82aa6fe37332e0b2a79a14f3d50c3c9f54034817;hp=10cf7905560c4747e3816e76090afe31759df5ce;hpb=e20877bdeb227b7c4179b6defa3eb5b44599d707;p=yaz-moved-to-github.git diff --git a/src/zoom-c.c b/src/zoom-c.c index 10cf790..bf4beb0 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.118 2007-03-19 20:58:34 adam Exp $ + * $Id: zoom-c.c,v 1.122 2007-03-21 11:27:46 adam Exp $ */ /** * \file zoom-c.c @@ -853,9 +853,16 @@ ZOOM_API(ZOOM_resultset) return r; } -ZOOM_API(int) +ZOOM_API(void) ZOOM_resultset_sort(ZOOM_resultset r, - const char *sort_type, const char *sort_spec) + const char *sort_type, const char *sort_spec) +{ + (void) ZOOM_resultset_sort(r, sort_type, sort_spec); +} + +ZOOM_API(int) + ZOOM_resultset_sort1(ZOOM_resultset r, + const char *sort_type, const char *sort_spec) { ZOOM_connection c = r->connection; ZOOM_task task; @@ -1284,7 +1291,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.118 $"); + version = odr_strdup(c->odr_out, "$Revision: 1.122 $"); if (strlen(version) > 10) /* check for unexpanded CVS strings */ version[strlen(version)-2] = '\0'; ireq->implementationVersion = @@ -1789,6 +1796,7 @@ static const char *record_iconv_return(ZOOM_record rec, int *len, *from = '\0'; strcpy(to, "UTF-8"); + if (record_charset && *record_charset) { /* Use "from,to" or just "from" */ @@ -1810,30 +1818,14 @@ static const char *record_iconv_return(ZOOM_record rec, int *len, if (*from && *to && (cd = yaz_iconv_open(to, from))) { - char outbuf[12]; - size_t inbytesleft = sz; - const char *inp = buf; - if (!rec->wrbuf_iconv) rec->wrbuf_iconv = wrbuf_alloc(); wrbuf_rewind(rec->wrbuf_iconv); - while (inbytesleft) - { - size_t outbytesleft = sizeof(outbuf); - char *outp = outbuf; - size_t r = yaz_iconv(cd, (char**) &inp, - &inbytesleft, - &outp, &outbytesleft); - if (r == (size_t) (-1)) - { - int e = yaz_iconv_error(cd); - if (e != YAZ_ICONV_E2BIG) - break; - } - wrbuf_write(rec->wrbuf_iconv, outbuf, outp - outbuf); - } + wrbuf_iconv_write(rec->wrbuf_iconv, cd, buf, sz); + wrbuf_iconv_reset(rec->wrbuf_iconv, cd); + buf = wrbuf_cstr(rec->wrbuf_iconv); sz = wrbuf_len(rec->wrbuf_iconv); yaz_iconv_close(cd); @@ -2643,21 +2635,21 @@ static zoom_ret send_present(ZOOM_connection c) } ZOOM_API(ZOOM_scanset) - ZOOM_connection_scan_pqf(ZOOM_connection c, const char *start) + ZOOM_connection_scan(ZOOM_connection c, const char *start) { ZOOM_scanset s; ZOOM_query q = ZOOM_query_create(); ZOOM_query_prefix(q, start); - s = ZOOM_connection_scan(c, q); + s = ZOOM_connection_scan1(c, q); ZOOM_query_destroy(q); return s; } ZOOM_API(ZOOM_scanset) - ZOOM_connection_scan(ZOOM_connection c, ZOOM_query q) + ZOOM_connection_scan1(ZOOM_connection c, ZOOM_query q) { char *start; char *freeme = 0; @@ -2857,12 +2849,11 @@ ZOOM_API(const char *) return ZOOM_options_get(scan->options, key); } -ZOOM_API(int) +ZOOM_API(void) ZOOM_scanset_option_set(ZOOM_scanset scan, const char *key, const char *val) { ZOOM_options_set(scan->options, key, val); - return 0; } static Z_APDU *create_es_package(ZOOM_package p, int type) @@ -3314,12 +3305,11 @@ ZOOM_API(const char *) } -ZOOM_API(int) +ZOOM_API(void) ZOOM_package_option_set(ZOOM_package p, const char *key, const char *val) { ZOOM_options_set(p->options, key, val); - return 0; } static int ZOOM_connection_exec_task(ZOOM_connection c) @@ -3883,20 +3873,18 @@ ZOOM_API(const char *) return ZOOM_options_getl(c->options, key, lenp); } -ZOOM_API(int) +ZOOM_API(void) ZOOM_connection_option_set(ZOOM_connection c, const char *key, const char *val) { ZOOM_options_set(c->options, key, val); - return 0; } -ZOOM_API(int) +ZOOM_API(void) ZOOM_connection_option_setl(ZOOM_connection c, const char *key, const char *val, int len) { ZOOM_options_setl(c->options, key, val, len); - return 0; } ZOOM_API(const char *) @@ -3905,12 +3893,11 @@ ZOOM_API(const char *) return ZOOM_options_get(r->options, key); } -ZOOM_API(int) +ZOOM_API(void) ZOOM_resultset_option_set(ZOOM_resultset r, const char *key, const char *val) { ZOOM_options_set(r->options, key, val); - return 0; } @@ -4096,6 +4083,12 @@ ZOOM_API(int) } +static void cql2pqf_wrbuf_puts(const char *buf, void *client_data) +{ + WRBUF wrbuf = client_data; + wrbuf_puts(wrbuf, buf); +} + /* * Returns an xmalloc()d string containing RPN that corresponds to the * CQL passed in. On error, sets the Connection object's error state @@ -4106,10 +4099,9 @@ static char *cql2pqf(ZOOM_connection c, const char *cql) { CQL_parser parser; int error; - struct cql_node *node; const char *cqlfile; - static cql_transform_t trans; - char pqfbuf[512]; + cql_transform_t trans; + char *result = 0; parser = cql_parser_create(); if ((error = cql_parser_string(parser, cql)) != 0) { @@ -4118,42 +4110,40 @@ static char *cql2pqf(ZOOM_connection c, const char *cql) return 0; } - node = cql_parser_result(parser); - /* ### Do not call cql_parser_destroy() yet: it destroys `node'! */ - cqlfile = ZOOM_connection_option_get(c, "cqlfile"); - if (cqlfile == 0) { - cql_parser_destroy(parser); - cql_node_destroy(node); + if (cqlfile == 0) + { set_ZOOM_error(c, ZOOM_ERROR_CQL_TRANSFORM, "no CQL transform file"); - return 0; } - - if ((trans = cql_transform_open_fname(cqlfile)) == 0) { + else if ((trans = cql_transform_open_fname(cqlfile)) == 0) + { char buf[512]; - cql_parser_destroy(parser); - cql_node_destroy(node); sprintf(buf, "can't open CQL transform file '%.200s': %.200s", cqlfile, strerror(errno)); set_ZOOM_error(c, ZOOM_ERROR_CQL_TRANSFORM, buf); - return 0; } - - error = cql_transform_buf(trans, node, pqfbuf, sizeof pqfbuf); - cql_parser_destroy(parser); - cql_node_destroy(node); - if (error != 0) { - char buf[512]; - const char *addinfo; - error = cql_transform_error(trans, &addinfo); + else + { + WRBUF wrbuf_result = wrbuf_alloc(); + error = cql_transform(trans, cql_parser_result(parser), + cql2pqf_wrbuf_puts, wrbuf_result); + if (error != 0) { + char buf[512]; + const char *addinfo; + error = cql_transform_error(trans, &addinfo); + sprintf(buf, "%.200s (addinfo=%.200s)", + cql_strerror(error), addinfo); + set_ZOOM_error(c, ZOOM_ERROR_CQL_TRANSFORM, buf); + } + else + { + result = xstrdup(wrbuf_cstr(wrbuf_result)); + } cql_transform_close(trans); - sprintf(buf, "%.200s (addinfo=%.200s)", cql_strerror(error), addinfo); - set_ZOOM_error(c, ZOOM_ERROR_CQL_TRANSFORM, buf); - return 0; + wrbuf_destroy(wrbuf_result); } - - cql_transform_close(trans); - return xstrdup(pqfbuf); + cql_parser_destroy(parser); + return result; } ZOOM_API(int) ZOOM_connection_fire_event_timeout(ZOOM_connection c)