X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Fzoom-c.c;h=75b694a1e2f25732ebcc5d68865a3ffb1e74fa86;hb=63c48920fd45817bf28177279f65099670fe258b;hp=923e500a878bea64aa8f2c2fd6e7024e23bd7bfe;hpb=b7ac19e96f5e53975064b3dec2be6cbd2c1eccb8;p=yaz-moved-to-github.git diff --git a/src/zoom-c.c b/src/zoom-c.c index 923e500..75b694a 100644 --- a/src/zoom-c.c +++ b/src/zoom-c.c @@ -16,14 +16,9 @@ #include #include #include -#include #include #include #include -#include -#include -#include -#include #include #include #include @@ -40,7 +35,6 @@ static int log_details0 = 0; static void resultset_destroy(ZOOM_resultset r); static zoom_ret do_write_ex(ZOOM_connection c, char *buf_out, int len_out); -static char *cql2pqf(ZOOM_connection c, const char *cql); ZOOM_API(const char *) ZOOM_get_event_str(int event) { @@ -621,142 +615,6 @@ ZOOM_API(void) } } -ZOOM_API(ZOOM_query) - ZOOM_query_create(void) -{ - ZOOM_query s = (ZOOM_query) xmalloc(sizeof(*s)); - - s->refcount = 1; - s->z_query = 0; - s->sort_spec = 0; - s->odr = odr_createmem(ODR_ENCODE); - s->query_string = 0; - - return s; -} - -ZOOM_API(void) - ZOOM_query_destroy(ZOOM_query s) -{ - if (!s) - return; - - (s->refcount)--; - if (s->refcount == 0) - { - odr_destroy(s->odr); - xfree(s); - } -} - -ZOOM_API(int) - ZOOM_query_prefix(ZOOM_query s, const char *str) -{ - s->query_string = odr_strdup(s->odr, str); - s->z_query = (Z_Query *) odr_malloc(s->odr, sizeof(*s->z_query)); - s->z_query->which = Z_Query_type_1; - s->z_query->u.type_1 = p_query_rpn(s->odr, str); - if (!s->z_query->u.type_1) - { - s->z_query = 0; - return -1; - } - return 0; -} - -ZOOM_API(int) - ZOOM_query_cql(ZOOM_query s, const char *str) -{ - Z_External *ext; - - s->query_string = odr_strdup(s->odr, str); - - ext = (Z_External *) odr_malloc(s->odr, sizeof(*ext)); - ext->direct_reference = odr_oiddup(s->odr, yaz_oid_userinfo_cql); - ext->indirect_reference = 0; - ext->descriptor = 0; - ext->which = Z_External_CQL; - ext->u.cql = s->query_string; - - s->z_query = (Z_Query *) odr_malloc(s->odr, sizeof(*s->z_query)); - s->z_query->which = Z_Query_type_104; - s->z_query->u.type_104 = ext; - - return 0; -} - -/* - * Translate the CQL string client-side into RPN which is passed to - * the server. This is useful for server's that don't themselves - * support CQL, for which ZOOM_query_cql() is useless. `conn' is used - * only as a place to stash diagnostics if compilation fails; if this - * information is not needed, a null pointer may be used. - */ -ZOOM_API(int) - ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn) -{ - char *rpn; - int ret; - ZOOM_connection freeme = 0; - - if (conn == 0) - conn = freeme = ZOOM_connection_create(0); - - rpn = cql2pqf(conn, str); - if (freeme != 0) - ZOOM_connection_destroy(freeme); - if (rpn == 0) - return -1; - - ret = ZOOM_query_prefix(s, rpn); - xfree(rpn); - return ret; -} - -/* - * Analogous in every way to ZOOM_query_cql2rpn(), except that there - * is no analogous ZOOM_query_ccl() that just sends uninterpreted CCL - * to the server, as the YAZ GFS doesn't know how to handle this. - */ -ZOOM_API(int) - ZOOM_query_ccl2rpn(ZOOM_query s, const char *str, const char *config, - int *ccl_error, const char **error_string, - int *error_pos) -{ - int ret; - struct ccl_rpn_node *rpn; - CCL_bibset bibset = ccl_qual_mk(); - - if (config) - ccl_qual_buf(bibset, config); - - rpn = ccl_find_str(bibset, str, ccl_error, error_pos); - if (!rpn) - { - *error_string = ccl_err_msg(*ccl_error); - ret = -1; - } - else - { - WRBUF wr = wrbuf_alloc(); - ccl_pquery(wr, rpn); - ccl_rpn_delete(rpn); - ret = ZOOM_query_prefix(s, wrbuf_cstr(wr)); - wrbuf_destroy(wr); - } - ccl_qual_rm(&bibset); - return ret; -} - -ZOOM_API(int) - ZOOM_query_sortby(ZOOM_query s, const char *criteria) -{ - s->sort_spec = yaz_sort_spec(s->odr, criteria); - if (!s->sort_spec) - return -1; - return 0; -} - ZOOM_API(void) ZOOM_resultset_release(ZOOM_resultset r) { #if ZOOM_RESULT_LISTS @@ -910,7 +768,7 @@ ZOOM_API(ZOOM_resultset) #endif yaz_log(c->log_api, "%p ZOOM_connection_search set %p query %p", c, r, q); - r->r_sort_spec = q->sort_spec; + r->r_sort_spec = ZOOM_query_get_sortspec(q); r->query = q; r->options = ZOOM_options_create_with_parent(c->options); @@ -975,7 +833,7 @@ ZOOM_API(ZOOM_resultset) ZOOM_resultset_addref(r); - (q->refcount)++; + ZOOM_query_addref(q); if (!c->async) { @@ -1417,6 +1275,7 @@ static zoom_ret ZOOM_connection_srw_send_search(ZOOM_connection c) ZOOM_resultset resultset = 0; Z_SRW_PDU *sr = 0; const char *option_val = 0; + Z_Query *z_query; if (c->error) /* don't continue on error */ return zoom_complete; @@ -1468,17 +1327,19 @@ static zoom_ret ZOOM_connection_srw_send_search(ZOOM_connection c) assert(resultset->query); sr = ZOOM_srw_get_pdu(c, Z_SRW_searchRetrieve_request); - if (resultset->query->z_query->which == Z_Query_type_104 - && resultset->query->z_query->u.type_104->which == Z_External_CQL) + z_query = ZOOM_query_get_Z_Query(resultset->query); + + if (z_query->which == Z_Query_type_104 + && z_query->u.type_104->which == Z_External_CQL) { sr->u.request->query_type = Z_SRW_query_type_cql; - sr->u.request->query.cql =resultset->query->z_query->u.type_104->u.cql; + sr->u.request->query.cql = z_query->u.type_104->u.cql; } - else if (resultset->query->z_query->which == Z_Query_type_1 && - resultset->query->z_query->u.type_1) + else if (z_query->which == Z_Query_type_1 && z_query->u.type_1) { sr->u.request->query_type = Z_SRW_query_type_pqf; - sr->u.request->query.pqf = resultset->query->query_string; + sr->u.request->query.pqf = + ZOOM_query_get_query_string(resultset->query); } else { @@ -2075,8 +1936,9 @@ ZOOM_API(ZOOM_scanset) ZOOM_connection_scan1(ZOOM_connection c, ZOOM_query q) { ZOOM_scanset scan = 0; + Z_Query *z_query = ZOOM_query_get_Z_Query(q); - if (!q->z_query) + if (!z_query) return 0; scan = (ZOOM_scanset) xmalloc(sizeof(*scan)); scan->connection = c; @@ -2087,7 +1949,7 @@ ZOOM_API(ZOOM_scanset) scan->srw_scan_response = 0; scan->query = q; - (q->refcount)++; + ZOOM_query_addref(q); scan->databaseNames = ZOOM_connection_get_databases(c, c->options, &scan->num_databaseNames, scan->odr); @@ -2148,6 +2010,7 @@ static zoom_ret ZOOM_connection_srw_send_scan(ZOOM_connection c) ZOOM_scanset scan; Z_SRW_PDU *sr = 0; const char *option_val = 0; + Z_Query *z_query; if (!c->tasks) return zoom_complete; @@ -2156,17 +2019,20 @@ static zoom_ret ZOOM_connection_srw_send_scan(ZOOM_connection c) sr = ZOOM_srw_get_pdu(c, Z_SRW_scan_request); + z_query = ZOOM_query_get_Z_Query(scan->query); /* SRU scan can only carry CQL and PQF */ - if (scan->query->z_query->which == Z_Query_type_104) + if (z_query->which == Z_Query_type_104) { sr->u.scan_request->query_type = Z_SRW_query_type_cql; - sr->u.scan_request->scanClause.cql = scan->query->query_string; + sr->u.scan_request->scanClause.cql = + ZOOM_query_get_query_string(scan->query); } - else if (scan->query->z_query->which == Z_Query_type_1 - || scan->query->z_query->which == Z_Query_type_101) + else if (z_query->which == Z_Query_type_1 + || z_query->which == Z_Query_type_101) { sr->u.scan_request->query_type = Z_SRW_query_type_pqf; - sr->u.scan_request->scanClause.pqf = scan->query->query_string; + sr->u.scan_request->scanClause.pqf = + ZOOM_query_get_query_string(scan->query); } else { @@ -2419,7 +2285,7 @@ ZOOM_API(int) break; case ZOOM_TASK_SORT: c->tasks->u.sort.resultset->r_sort_spec = - c->tasks->u.sort.q->sort_spec; + ZOOM_query_get_sortspec(c->tasks->u.sort.q); ret = send_Z3950_sort(c, c->tasks->u.sort.resultset); break; } @@ -3130,69 +2996,6 @@ ZOOM_API(int) } -static void cql2pqf_wrbuf_puts(const char *buf, void *client_data) -{ - WRBUF 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 - * and returns a null pointer. - * ### We could cache CQL parser and/or transformer in Connection. - */ -static char *cql2pqf(ZOOM_connection c, const char *cql) -{ - CQL_parser parser; - int error; - const char *cqlfile; - cql_transform_t trans; - char *result = 0; - - parser = cql_parser_create(); - if ((error = cql_parser_string(parser, cql)) != 0) { - cql_parser_destroy(parser); - ZOOM_set_error(c, ZOOM_ERROR_CQL_PARSE, cql); - return 0; - } - - cqlfile = ZOOM_connection_option_get(c, "cqlfile"); - if (cqlfile == 0) - { - ZOOM_set_error(c, ZOOM_ERROR_CQL_TRANSFORM, "no CQL transform file"); - } - else if ((trans = cql_transform_open_fname(cqlfile)) == 0) - { - char buf[512]; - sprintf(buf, "can't open CQL transform file '%.200s': %.200s", - cqlfile, strerror(errno)); - ZOOM_set_error(c, ZOOM_ERROR_CQL_TRANSFORM, buf); - } - 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); - ZOOM_set_error(c, ZOOM_ERROR_CQL_TRANSFORM, buf); - } - else - { - result = xstrdup(wrbuf_cstr(wrbuf_result)); - } - cql_transform_close(trans); - wrbuf_destroy(wrbuf_result); - } - cql_parser_destroy(parser); - return result; -} - ZOOM_API(int) ZOOM_connection_fire_event_timeout(ZOOM_connection c) { if (c->mask)