- if (send_apdu(cl, a) >= 0)
- {
- cl->show_raw->active = 1;
- cl->state = Client_Presenting;
- }
- else
- {
- client_show_raw_error(cl, "send_apdu failed");
- cl->state = Client_Error;
- }
- odr_reset(global_parameters.odr_out);
-}
-
-void client_send_present(struct client *cl)
-{
- struct session_database *sdb = client_get_database(cl);
- Z_APDU *a = zget_APDU(global_parameters.odr_out, Z_APDU_presentRequest);
- int toget;
- int start = cl->records + 1;
- const char *syntax = 0;
- const char *elements = 0;
-
- toget = global_parameters.chunk;
- if (toget > global_parameters.toget - cl->records)
- toget = global_parameters.toget - cl->records;
- if (toget > cl->hits - cl->records)
- toget = cl->hits - cl->records;
-
- yaz_log(YLOG_DEBUG, "Trying to present %d record(s) from %d",
- toget, start);
-
- a->u.presentRequest->resultSetStartPoint = &start;
- a->u.presentRequest->numberOfRecordsRequested = &toget;
-
- syntax = session_setting_oneval(sdb, PZ_REQUESTSYNTAX);
- client_present_syntax(a, syntax);
-
- elements = session_setting_oneval(sdb, PZ_ELEMENTS);
- client_present_elements(a, elements);
-
- if (send_apdu(cl, a) >= 0)
- cl->state = Client_Presenting;
- else
- cl->state = Client_Error;
- odr_reset(global_parameters.odr_out);
-}
-
-
-void client_send_search(struct client *cl)
-{
- struct session *se = client_get_session(cl);
- struct session_database *sdb = client_get_database(cl);
- Z_APDU *a = zget_APDU(global_parameters.odr_out, Z_APDU_searchRequest);
- int ndb;
- char **databaselist;
- Z_Query *zquery;
- int ssub = 0, lslb = 100000, mspn = 10;
- const char *piggyback = session_setting_oneval(sdb, PZ_PIGGYBACK);
- const char *queryenc = session_setting_oneval(sdb, PZ_QUERYENCODING);
-
- yaz_log(YLOG_DEBUG, "Sending search to %s", sdb->database->url);
-
-
- // constructing RPN query
- a->u.searchRequest->query = zquery = odr_malloc(global_parameters.odr_out,
- sizeof(Z_Query));
- zquery->which = Z_Query_type_1;
- zquery->u.type_1 = p_query_rpn(global_parameters.odr_out,
- client_get_pquery(cl));
-
- // converting to target encoding
- if (queryenc && *queryenc)
- {
- yaz_iconv_t iconv = yaz_iconv_open(queryenc, "UTF-8");
- if (iconv){
- yaz_query_charset_convert_rpnquery(zquery->u.type_1,
- global_parameters.odr_out,
- iconv);
- yaz_iconv_close(iconv);
- } else
- yaz_log(YLOG_WARN, "Query encoding failed %s %s",
- client_get_database(cl)->database->url, queryenc);
- }
-
- for (ndb = 0; sdb->database->databases[ndb]; ndb++)
- ;
- databaselist = odr_malloc(global_parameters.odr_out, sizeof(char*) * ndb);
- for (ndb = 0; sdb->database->databases[ndb]; ndb++)
- databaselist[ndb] = sdb->database->databases[ndb];
-
- if (!piggyback || *piggyback == '1')
- {
- const char *elements = session_setting_oneval(sdb, PZ_ELEMENTS);
- const char *recsyn = session_setting_oneval(sdb, PZ_REQUESTSYNTAX);
- if (recsyn && *recsyn)
- {
- a->u.searchRequest->preferredRecordSyntax =
- yaz_string_to_oid_odr(yaz_oid_std(),
- CLASS_RECSYN, recsyn,
- global_parameters.odr_out);
- }
- if (elements && *elements)
- {
- Z_ElementSetNames *esn =
- odr_malloc(global_parameters.odr_out, sizeof(*esn));
- esn->which = Z_ElementSetNames_generic;
- esn->u.generic = odr_strdup(global_parameters.odr_out, elements);
-
- a->u.searchRequest->smallSetElementSetNames = esn;
- a->u.searchRequest->mediumSetElementSetNames = esn;
- }
- a->u.searchRequest->smallSetUpperBound = &ssub;
- a->u.searchRequest->largeSetLowerBound = &lslb;
- a->u.searchRequest->mediumSetPresentNumber = &mspn;
- }
- a->u.searchRequest->databaseNames = databaselist;
- a->u.searchRequest->num_databaseNames = ndb;
-
-
- { //scope for sending and logging queries
- WRBUF wbquery = wrbuf_alloc();
- yaz_query_to_wrbuf(wbquery, a->u.searchRequest->query);
-
-
- if (send_apdu(cl, a) >= 0)
- {
- client_set_state(cl, Client_Searching);
- client_set_requestid(cl, se->requestid);
- yaz_log(YLOG_LOG, "SearchRequest %s %s %s",
- client_get_database(cl)->database->url,
- queryenc ? queryenc : "UTF-8",
- wrbuf_cstr(wbquery));
- }
- else {
- client_set_state(cl, Client_Error);
- yaz_log(YLOG_WARN, "Failed SearchRequest %s %s %s",
- client_get_database(cl)->database->url,
- queryenc ? queryenc : "UTF-8",
- wrbuf_cstr(wbquery));
- }
-
- wrbuf_destroy(wbquery);
- }
-
- odr_reset(global_parameters.odr_out);
-}
-
-void client_init_response(struct client *cl, Z_APDU *a)
-{
- Z_InitResponse *r = a->u.initResponse;
-
- yaz_log(YLOG_DEBUG, "Init response %s", cl->database->database->url);
-
- if (*r->result)
- cl->state = Client_Continue;
- else
- cl->state = Client_Failed; // FIXME need to do something to the connection