X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=client%2Fclient.c;h=e41c9f6eba48f8248822b8bd5347d8e10fe05a14;hb=1c256a41a684b68d2dea7c5bad34e02293a60de9;hp=1ad5cc5073f05e9894e664128d059102d4e8cfd5;hpb=44f9af0d137755e7452711b517dd87f5da95ace2;p=yaz-moved-to-github.git diff --git a/client/client.c b/client/client.c index 1ad5cc5..e41c9f6 100644 --- a/client/client.c +++ b/client/client.c @@ -80,6 +80,7 @@ static file_history_t file_history = 0; +static char webservice_type[10]; static char sru_method[10] = "soap"; static char sru_version[10] = "1.2"; static char *codeset = 0; /* character set for output */ @@ -171,13 +172,13 @@ struct eoi { char* value; } extraOtherInfos[maxOtherInfosSupported]; -void process_cmd_line(char* line); +static void process_cmd_line(char* line); #if HAVE_READLINE_READLINE_H -char **readline_completer(char *text, int start, int end); +static char **readline_completer(char *text, int start, int end); #endif static char *command_generator(const char *text, int state); -int cmd_register_tab(const char* arg); -int cmd_querycharset(const char *arg); +static int cmd_register_tab(const char* arg); +static int cmd_querycharset(const char *arg); static void close_session(void); @@ -191,7 +192,7 @@ ODR getODROutputStream(void) return out; } -const char* query_type_as_string(QueryType q) +static const char* query_type_as_string(QueryType q) { switch (q) { @@ -243,7 +244,7 @@ static void do_hex_dump(const char* buf, size_t len) } } -void add_otherInfos(Z_APDU *a) +static void add_otherInfos(Z_APDU *a) { Z_OtherInformation **oi; int i; @@ -326,7 +327,7 @@ static Z_ReferenceId *set_refid(ODR out) /* INIT SERVICE ------------------------------- */ -static void send_initRequest(const char* type_and_host) +static void send_Z3950_initRequest(const char* type_and_host) { Z_APDU *apdu = zget_APDU(out, Z_APDU_initRequest); Z_InitRequest *req = apdu->u.initRequest; @@ -375,7 +376,6 @@ static void send_initRequest(const char* type_and_host) } -/* These two are used only from process_initResponse() */ static void render_initUserInfo(Z_OtherInformation *ui1); static void render_diag(Z_DiagnosticFormat *diag); @@ -384,7 +384,7 @@ static void pr_opt(const char *opt, void *clientData) printf(" %s", opt); } -static int process_initResponse(Z_InitResponse *res) +static int process_Z3950_initResponse(Z_InitResponse *res) { int ver = 0; /* save session parameters for later use */ @@ -733,7 +733,7 @@ static int session_connect_base(const char *arg, const char **basep) cs_print_session_info(conn); if (protocol == PROTO_Z3950) { - send_initRequest(type_and_host); + send_Z3950_initRequest(type_and_host); return 2; } return 0; @@ -752,7 +752,7 @@ static int session_connect(const char *arg) return r; } -int cmd_open(const char *arg) +static int cmd_open(const char *arg) { int r; if (arg) @@ -773,7 +773,7 @@ int cmd_open(const char *arg) return r; } -int cmd_authentication(const char *arg) +static int cmd_authentication(const char *arg) { char **args; int r; @@ -1179,7 +1179,7 @@ static void display_records(Z_Records *p) } } -static int send_deleteResultSetRequest(const char *arg) +static int send_Z3950_deleteResultSetRequest(const char *arg) { char names[8][32]; int i; @@ -1391,7 +1391,7 @@ static int send_SRW_scanRequest(const char *arg, int pos, int num) /* regular requestse .. */ sr = yaz_srw_get_pdu(out, Z_SRW_scan_request, sru_version); - switch(queryType) + switch (queryType) { case QueryType_CQL: sr->u.scan_request->query_type = Z_SRW_query_type_cql; @@ -1410,6 +1410,43 @@ static int send_SRW_scanRequest(const char *arg, int pos, int num) return send_srw(sr); } +static void encode_SOLR_search(Z_HTTP_Request *hreq, ODR encode, + const char *query) +{ + char *path; + const char *name[10], *value[10]; + char *uri_args; + + name[0] = "q"; + value[0] = query; + name[1] = 0; + + yaz_array_to_uri(&uri_args, encode, (char **) name, (char **) value); + + path = (char *) + odr_malloc(encode, strlen(hreq->path) + strlen(uri_args) + 4); + + hreq->method = "GET"; + + if (strchr(hreq->path, '?')) + sprintf(path, "%s&%s", hreq->path, uri_args); + else + sprintf(path, "%s?%s", hreq->path, uri_args); + hreq->path = path; +} + +static int send_SOLR_searchRequest(const char *arg) +{ + Z_GDU *gdu; + char *path = yaz_encode_sru_dbpath_odr(out, databaseNames[0]); + + gdu = z_get_HTTP_Request_host_path(out, cur_host, path); + + encode_SOLR_search(gdu->u.HTTP_Request, out, arg); + + return send_gdu(gdu); +} + static int send_SRW_searchRequest(const char *arg) { Z_SRW_PDU *sr = 0; @@ -1430,7 +1467,7 @@ static int send_SRW_searchRequest(const char *arg) /* regular request .. */ sr = yaz_srw_get_pdu(out, Z_SRW_searchRetrieve_request, sru_version); - switch(queryType) + switch (queryType) { case QueryType_CQL: srw_sr->u.request->query_type = Z_SRW_query_type_cql; @@ -1476,7 +1513,7 @@ static void query_charset_convert(Z_RPNQuery *q) } } -static int send_searchRequest(const char *arg) +static int send_Z3950_searchRequest(const char *arg) { Z_APDU *apdu = zget_APDU(out, Z_APDU_searchRequest); Z_SearchRequest *req = apdu->u.searchRequest; @@ -1748,7 +1785,7 @@ static void display_searchResult(Z_OtherInformation *o) } } -static int process_searchResponse(Z_SearchResponse *res) +static int process_Z3950_searchResponse(Z_SearchResponse *res) { printf("Received SearchResponse.\n"); print_refid(res->referenceId); @@ -1764,7 +1801,7 @@ static int process_searchResponse(Z_SearchResponse *res) if (res->resultSetStatus) { printf("Result Set Status: "); - switch(*res->resultSetStatus) + switch (*res->resultSetStatus) { case Z_SearchResponse_subset: printf("subset"); break; @@ -1953,7 +1990,7 @@ static void print_external(int iLevel, Z_External *pExternal) } } -static int process_resourceControlRequest(Z_ResourceControlRequest *req) +static int process_Z3950_resourceControlRequest(Z_ResourceControlRequest *req) { printf("Received ResourceControlRequest.\n"); print_referenceId(1, req->referenceId); @@ -1965,7 +2002,7 @@ static int process_resourceControlRequest(Z_ResourceControlRequest *req) return 0; } -void process_ESResponse(Z_ExtendedServicesResponse *res) +static void process_Z3950_ESResponse(Z_ExtendedServicesResponse *res) { printf("Status: "); switch (*res->operationStatus) @@ -2063,7 +2100,7 @@ void process_ESResponse(Z_ExtendedServicesResponse *res) } } -const char *get_ill_element(void *clientData, const char *element) +static const char *get_ill_element(void *clientData, const char *element) { return 0; } @@ -2244,8 +2281,8 @@ static Z_External *create_ItemOrderExternal(const char *type, int itemno, return r; } -static int send_itemorder(const char *type, int itemno, - const char *xml_buf, int xml_len) +static int send_Z3950_itemorder(const char *type, int itemno, + const char *xml_buf, int xml_len) { Z_APDU *apdu = zget_APDU(out, Z_APDU_extendedServicesRequest); Z_ExtendedServicesRequest *req = apdu->u.extendedServicesRequest; @@ -2288,11 +2325,11 @@ static int cmd_update0(const char *arg) return cmd_update_common(arg, 0); } -static int cmd_update_Z3950(int version, int action_no, const char *recid, +static int send_Z3950_update(int version, int action_no, const char *recid, char *rec_buf, int rec_len); #if YAZ_HAVE_XML2 -static int cmd_update_SRW(int action_no, const char *recid, +static int send_SRW_update(int action_no, const char *recid, char *rec_buf, int rec_len); #endif @@ -2347,14 +2384,14 @@ static int cmd_update_common(const char *arg, int version) #if YAZ_HAVE_XML2 if (protocol == PROTO_HTTP) - return cmd_update_SRW(action_no, recid_buf, rec_buf, rec_len); + return send_SRW_update(action_no, recid_buf, rec_buf, rec_len); #endif - return cmd_update_Z3950(version, action_no, recid_buf, rec_buf, rec_len); + return send_Z3950_update(version, action_no, recid_buf, rec_buf, rec_len); } #if YAZ_HAVE_XML2 -static int cmd_update_SRW(int action_no, const char *recid, - char *rec_buf, int rec_len) +static int send_SRW_update(int action_no, const char *recid, + char *rec_buf, int rec_len) { if (!conn) session_connect(cur_host); @@ -2365,7 +2402,7 @@ static int cmd_update_SRW(int action_no, const char *recid, Z_SRW_PDU *srw = yaz_srw_get(out, Z_SRW_update_request); Z_SRW_updateRequest *sr = srw->u.update_request; - switch(action_no) + switch (action_no) { case Z_IUOriginPartToKeep_recordInsert: sr->operation = "info:srw/action/1/create"; @@ -2391,7 +2428,7 @@ static int cmd_update_SRW(int action_no, const char *recid, } #endif -static int cmd_update_Z3950(int version, int action_no, const char *recid, +static int send_Z3950_update(int version, int action_no, const char *recid, char *rec_buf, int rec_len) { Z_APDU *apdu = zget_APDU(out, Z_APDU_extendedServicesRequest ); @@ -2593,7 +2630,7 @@ static int cmd_itemorder(const char *arg) parse_cmd_doc(&arg, out, &xml_buf, &xml_len); fflush(stdout); - send_itemorder(type, itemno, xml_buf, xml_len); + send_Z3950_itemorder(type, itemno, xml_buf, xml_len); return 2; } @@ -2663,7 +2700,7 @@ static int cmd_init(const char *arg) } if (only_z3950()) return 1; - send_initRequest(cur_host); + send_Z3950_initRequest(cur_host); return 2; } @@ -2801,6 +2838,7 @@ static int cmd_sru(const char *arg) else { int r; + strcpy(webservice_type, "sru"); r = sscanf(arg, "%9s %9s", sru_method, sru_version); if (r >= 1) { @@ -2821,6 +2859,29 @@ static int cmd_sru(const char *arg) return 0; } +static int cmd_webservice(const char *arg) +{ + if (!*arg) + { + printf("Webservice: %s\n", webservice_type); + } + else + { + if (!strcmp(arg, "sru")) + ; + else if (!strcmp(arg, "solr")) + ; + else + { + printf("Unknown webservice type\n"); + return 0; + } + strcpy(webservice_type, arg); + } + return 0; +} + + static int cmd_find(const char *arg) { if (!*arg) @@ -2835,8 +2896,16 @@ static int cmd_find(const char *arg) session_connect(cur_host); if (!conn) return 0; - if (!send_SRW_searchRequest(arg)) - return 0; + if (!strcmp(webservice_type, "solr")) + { + if (!send_SOLR_searchRequest(arg)) + return 0; + } + else + { + if (!send_SRW_searchRequest(arg)) + return 0; + } #else return 0; #endif @@ -2850,7 +2919,7 @@ static int cmd_find(const char *arg) { if (conn) { - if (!send_searchRequest(arg)) + if (!send_Z3950_searchRequest(arg)) return 0; wait_and_handle_response(0); if (conn) @@ -2868,7 +2937,7 @@ static int cmd_find(const char *arg) } else if (conn) { - if (!send_searchRequest(arg)) + if (!send_Z3950_searchRequest(arg)) return 0; } else @@ -2916,7 +2985,7 @@ static int cmd_delete(const char *arg) { if (only_z3950()) return 0; - if (!send_deleteResultSetRequest(arg)) + if (!send_Z3950_deleteResultSetRequest(arg)) return 0; return 2; } @@ -3020,7 +3089,7 @@ static int parse_show_args(const char *arg_c, char *setstring, return 1; } -static int send_presentRequest(const char *arg) +static int send_Z3950_presentRequest(const char *arg) { Z_APDU *apdu = zget_APDU(out, Z_APDU_presentRequest); Z_PresentRequest *req = apdu->u.presentRequest; @@ -3146,7 +3215,7 @@ static void close_session(void) last_hit_count = 0; } -void process_close(Z_Close *req) +static void process_Z3950_close(Z_Close *req) { Z_APDU *apdu = zget_APDU(out, Z_APDU_close); Z_Close *res = apdu->u.close; @@ -3200,13 +3269,13 @@ static int cmd_show(const char *arg) printf("Not connected yet\n"); return 0; } - if (!send_presentRequest(arg)) + if (!send_Z3950_presentRequest(arg)) return 0; } return 2; } -void exit_client(int code) +static void exit_client(int code) { file_history_save(file_history); file_history_destroy(&file_history); @@ -3214,7 +3283,7 @@ void exit_client(int code) exit(code); } -int cmd_quit(const char *arg) +static int cmd_quit(const char *arg) { printf("See you later, alligator.\n"); xmalloc_trav(""); @@ -3222,41 +3291,48 @@ int cmd_quit(const char *arg) return 0; } -int cmd_cancel(const char *arg) +static int cmd_cancel(const char *arg) { - Z_APDU *apdu = zget_APDU(out, Z_APDU_triggerResourceControlRequest); - Z_TriggerResourceControlRequest *req = - apdu->u.triggerResourceControlRequest; - bool_t rfalse = 0; - char command[16]; - - *command = '\0'; - sscanf(arg, "%15s", command); - if (only_z3950()) return 0; - if (session_initResponse && - !ODR_MASK_GET(session_initResponse->options, - Z_Options_triggerResourceCtrl)) + else { - printf("Target doesn't support cancel (trigger resource ctrl)\n"); - return 0; + Z_APDU *apdu = zget_APDU(out, Z_APDU_triggerResourceControlRequest); + Z_TriggerResourceControlRequest *req = + apdu->u.triggerResourceControlRequest; + bool_t rfalse = 0; + char command[16]; + + *command = '\0'; + sscanf(arg, "%15s", command); + + if (only_z3950()) + return 0; + if (session_initResponse && + !ODR_MASK_GET(session_initResponse->options, + Z_Options_triggerResourceCtrl)) + { + printf("Target doesn't support cancel (trigger resource ctrl)\n"); + return 0; + } + *req->requestedAction = Z_TriggerResourceControlRequest_cancel; + req->resultSetWanted = &rfalse; + req->referenceId = set_refid(out); + + send_apdu(apdu); + printf("Sent cancel request\n"); + if (!strcmp(command, "wait")) + return 2; + return 1; } - *req->requestedAction = Z_TriggerResourceControlRequest_cancel; - req->resultSetWanted = &rfalse; - req->referenceId = set_refid(out); - - send_apdu(apdu); - printf("Sent cancel request\n"); - if (!strcmp(command, "wait")) - return 2; - return 1; } - -int cmd_cancel_find(const char *arg) +static int cmd_cancel_find(const char *arg) { - int fres = cmd_find(arg); + int fres; + if (only_z3950()) + return 0; + fres = cmd_find(arg); if (fres > 0) { return cmd_cancel(""); @@ -3264,8 +3340,8 @@ int cmd_cancel_find(const char *arg) return fres; } -int send_scanrequest(const char *set, const char *query, - Odr_int pp, Odr_int num, const char *term) +static int send_Z3950_scanrequest(const char *set, const char *query, + Odr_int pp, Odr_int num, const char *term) { Z_APDU *apdu = zget_APDU(out, Z_APDU_scanRequest); Z_ScanRequest *req = apdu->u.scanRequest; @@ -3352,7 +3428,7 @@ int send_scanrequest(const char *set, const char *query, return 2; } -int send_sortrequest(const char *arg, int newset) +static int send_sortrequest(const char *arg, int newset) { Z_APDU *apdu = zget_APDU(out, Z_APDU_sortRequest); Z_SortRequest *req = apdu->u.sortRequest; @@ -3389,7 +3465,7 @@ int send_sortrequest(const char *arg, int newset) return 2; } -void display_term_info(Z_TermInfo *t) +static void display_term_info(Z_TermInfo *t) { if (t->displayTerm) printf("%s", t->displayTerm); @@ -3407,7 +3483,7 @@ void display_term_info(Z_TermInfo *t) printf("\n"); } -void process_scanResponse(Z_ScanResponse *res) +static void process_Z3950_scanResponse(Z_ScanResponse *res) { int i; Z_Entry **entries = NULL; @@ -3441,7 +3517,7 @@ void process_scanResponse(Z_ScanResponse *res) res->entries->num_nonsurrogateDiagnostics); } -void process_sortResponse(Z_SortResponse *res) +static void process_Z3950_sortResponse(Z_SortResponse *res) { printf("Received SortResponse: status="); switch (*res->sortStatus) @@ -3462,7 +3538,8 @@ void process_sortResponse(Z_SortResponse *res) res->num_diagnostics); } -void process_deleteResultSetResponse(Z_DeleteResultSetResponse *res) +static void process_Z3950_deleteResultSetResponse( + Z_DeleteResultSetResponse *res) { printf("Got deleteResultSetResponse status=" ODR_INT_PRINTF "\n", *res->deleteOperationStatus); @@ -3478,7 +3555,7 @@ void process_deleteResultSetResponse(Z_DeleteResultSetResponse *res) } } -int cmd_sort_generic(const char *arg, int newset) +static int cmd_sort_generic(const char *arg, int newset) { if (only_z3950()) return 0; @@ -3497,23 +3574,23 @@ int cmd_sort_generic(const char *arg, int newset) return 0; } -int cmd_sort(const char *arg) +static int cmd_sort(const char *arg) { return cmd_sort_generic(arg, 0); } -int cmd_sort_newset(const char *arg) +static int cmd_sort_newset(const char *arg) { return cmd_sort_generic(arg, 1); } -int cmd_scanstep(const char *arg) +static int cmd_scanstep(const char *arg) { scan_stepSize = atoi(arg); return 0; } -int cmd_scanpos(const char *arg) +static int cmd_scanpos(const char *arg) { int r = sscanf(arg, "%d", &scan_position); if (r == 0) @@ -3521,7 +3598,7 @@ int cmd_scanpos(const char *arg) return 0; } -int cmd_scansize(const char *arg) +static int cmd_scansize(const char *arg) { int r = sscanf(arg, "%d", &scan_size); if (r == 0) @@ -3571,26 +3648,26 @@ static int cmd_scan_common(const char *set, const char *arg) if (*arg) { strcpy(last_scan_query, arg); - if (send_scanrequest(set, arg, - scan_position, scan_size, 0) < 0) + if (send_Z3950_scanrequest(set, arg, + scan_position, scan_size, 0) < 0) return 0; } else { - if (send_scanrequest(set, last_scan_query, - 1, scan_size, last_scan_line) < 0) + if (send_Z3950_scanrequest(set, last_scan_query, + 1, scan_size, last_scan_line) < 0) return 0; } return 2; } } -int cmd_scan(const char *arg) +static int cmd_scan(const char *arg) { return cmd_scan_common(0, arg); } -int cmd_setscan(const char *arg) +static int cmd_setscan(const char *arg) { char setstring[100]; int nor; @@ -3602,7 +3679,7 @@ int cmd_setscan(const char *arg) return cmd_scan_common(setstring, arg + nor); } -int cmd_schema(const char *arg) +static int cmd_schema(const char *arg) { xfree(record_schema); record_schema = 0; @@ -3611,7 +3688,7 @@ int cmd_schema(const char *arg) return 1; } -int cmd_format(const char *arg) +static int cmd_format(const char *arg) { const char *cp = arg; int nor; @@ -3654,7 +3731,7 @@ int cmd_format(const char *arg) return 1; } -int cmd_elements(const char *arg) +static int cmd_elements(const char *arg) { static Z_ElementSetNames esn; static char what[100]; @@ -3671,7 +3748,7 @@ int cmd_elements(const char *arg) return 1; } -int cmd_querytype(const char *arg) +static int cmd_querytype(const char *arg) { if (!strcmp(arg, "ccl")) queryType = QueryType_CCL; @@ -3696,7 +3773,7 @@ int cmd_querytype(const char *arg) return 1; } -int cmd_refid(const char *arg) +static int cmd_refid(const char *arg) { xfree(refid); refid = NULL; @@ -3705,7 +3782,7 @@ int cmd_refid(const char *arg) return 1; } -int cmd_close(const char *arg) +static int cmd_close(const char *arg) { Z_APDU *apdu; Z_Close *req; @@ -3729,7 +3806,7 @@ int cmd_packagename(const char* arg) return 1; } -int cmd_proxy(const char* arg) +static int cmd_proxy(const char* arg) { xfree(yazProxy); yazProxy = 0; @@ -3738,7 +3815,7 @@ int cmd_proxy(const char* arg) return 1; } -int cmd_marccharset(const char *arg) +static int cmd_marccharset(const char *arg) { char l1[30]; @@ -3756,7 +3833,7 @@ int cmd_marccharset(const char *arg) return 1; } -int cmd_querycharset(const char *arg) +static int cmd_querycharset(const char *arg) { char l1[30]; @@ -3774,7 +3851,7 @@ int cmd_querycharset(const char *arg) return 1; } -int cmd_displaycharset(const char *arg) +static int cmd_displaycharset(const char *arg) { char l1[30]; @@ -3804,7 +3881,7 @@ int cmd_displaycharset(const char *arg) return 1; } -int cmd_negcharset(const char *arg) +static int cmd_negcharset(const char *arg) { char l1[30]; @@ -3834,7 +3911,7 @@ int cmd_negcharset(const char *arg) return 1; } -int cmd_charset(const char* arg) +static int cmd_charset(const char* arg) { char l1[30], l2[30], l3[30], l4[30]; @@ -3859,7 +3936,7 @@ int cmd_charset(const char* arg) return 1; } -int cmd_lang(const char* arg) +static int cmd_lang(const char* arg) { if (*arg == '\0') { @@ -3873,7 +3950,7 @@ int cmd_lang(const char* arg) return 1; } -int cmd_source(const char* arg, int echo ) +static int cmd_source(const char* arg, int echo ) { /* first should open the file and read one line at a time.. */ FILE* includeFile; @@ -3916,20 +3993,13 @@ int cmd_source(const char* arg, int echo ) return 1; } -int cmd_source_echo(const char* arg) +static int cmd_source_echo(const char* arg) { cmd_source(arg, 1); return 1; } -int cmd_source_noecho(const char* arg) -{ - cmd_source(arg, 0); - return 1; -} - - -int cmd_subshell(const char* args) +static int cmd_subshell(const char* args) { int ret = system(strlen(args) ? args : getenv("SHELL")); printf("\n"); @@ -3940,7 +4010,7 @@ int cmd_subshell(const char* args) return 1; } -int cmd_set_berfile(const char *arg) +static int cmd_set_berfile(const char *arg) { if (ber_file && ber_file != stdout && ber_file != stderr) fclose(ber_file); @@ -3953,7 +4023,7 @@ int cmd_set_berfile(const char *arg) return 1; } -int cmd_set_apdufile(const char *arg) +static int cmd_set_apdufile(const char *arg) { if (apdu_file && apdu_file != stderr && apdu_file != stderr) fclose(apdu_file); @@ -3972,7 +4042,7 @@ int cmd_set_apdufile(const char *arg) return 1; } -int cmd_set_cclfile(const char* arg) +static int cmd_set_cclfile(const char* arg) { FILE *inf; @@ -3989,7 +4059,7 @@ int cmd_set_cclfile(const char* arg) return 0; } -int cmd_set_cqlfile(const char* arg) +static int cmd_set_cqlfile(const char* arg) { cql_transform_t newcqltrans; @@ -4006,7 +4076,7 @@ int cmd_set_cqlfile(const char* arg) return 0; } -int cmd_set_auto_reconnect(const char* arg) +static int cmd_set_auto_reconnect(const char* arg) { if (strlen(arg)==0) auto_reconnect = ! auto_reconnect; @@ -4028,8 +4098,7 @@ int cmd_set_auto_reconnect(const char* arg) return 0; } - -int cmd_set_auto_wait(const char* arg) +static int cmd_set_auto_wait(const char* arg) { if (strlen(arg)==0) auto_wait = ! auto_wait; @@ -4051,7 +4120,7 @@ int cmd_set_auto_wait(const char* arg) return 0; } -int cmd_set_marcdump(const char* arg) +static int cmd_set_marcdump(const char* arg) { if (marc_file && marc_file != stderr) { /* don't close stdout*/ @@ -4084,7 +4153,7 @@ static void marc_file_write(const char *buf, size_t sz) /* this command takes 3 arge {name class oid} */ -int cmd_register_oid(const char* args) +static int cmd_register_oid(const char* args) { static struct { char* className; @@ -4144,7 +4213,7 @@ int cmd_register_oid(const char* args) return 1; } -int cmd_push_command(const char* arg) +static int cmd_push_command(const char* arg) { #if HAVE_READLINE_HISTORY_H if (strlen(arg) > 1) @@ -4193,7 +4262,7 @@ void source_rc_file(const char *rc_file) } } -void add_to_readline_history(void *client_data, const char *line) +static void add_to_readline_history(void *client_data, const char *line) { #if HAVE_READLINE_HISTORY_H if (strlen(line)) @@ -4213,6 +4282,8 @@ static void initialize(const char *rc_file) fprintf(stderr, "failed to allocate ODR streams\n"); exit(1); } + + strcpy(webservice_type, "sru"); setvbuf(stdout, 0, _IONBF, 0); if (apdu_file) @@ -4346,6 +4417,91 @@ static void handle_srw_scan_response(Z_SRW_scanResponse *res) handle_srw_scan_term(res->terms + i); } +static int decode_SOLR_response(const char *content_buf, int content_len) +{ + xmlDocPtr doc = xmlParseMemory(content_buf, content_len); + int ret = 0; + xmlNodePtr ptr = 0; + Odr_int hits = 0; + Odr_int start = 0; + + if (!doc) + { + ret = -1; + } + if (doc) + { + xmlNodePtr root = xmlDocGetRootElement(doc); + if (!root) + { + ret = -1; + } + else if (strcmp((const char *) root->name, "response")) + { + ret = -1; + } + else + { + /** look for result node */ + for (ptr = root->children; ptr; ptr = ptr->next) + { + if (ptr->type == XML_ELEMENT_NODE && + !strcmp((const char *) ptr->name, "result")) + break; + } + if (!ptr) + { + ret = -1; + } + } + } + if (ptr) + { /* got result node */ + struct _xmlAttr *attr; + for (attr = ptr->properties; attr; attr = attr->next) + if (attr->children && attr->children->type == XML_TEXT_NODE) + { + if (!strcmp((const char *) attr->name, "numFound")) + { + hits = odr_atoi((const char *) attr->children->content); + } + else if (!strcmp((const char *) attr->name, "start")) + { + start = odr_atoi((const char *) attr->children->content); + } + } + printf("Number of hits: " ODR_INT_PRINTF "\n", hits); + } + if (ptr) + { + xmlNodePtr node; + int offset = 0; + + for (node = ptr->children; node; node = node->next) + { + if (node->type == XML_ELEMENT_NODE) + { + xmlBufferPtr buf = xmlBufferCreate(); + xmlNode *tmp = xmlCopyNode(node, 1); + + printf(ODR_INT_PRINTF "\n", start + offset); + + xmlNodeDump(buf, tmp->doc, tmp, 0, 0); + + xmlFreeNode(tmp); + + fwrite(buf->content, 1, buf->use, stdout); + xmlBufferFree(buf); + offset++; + printf("\n"); + } + } + } + if (doc) + xmlFreeDoc(doc); + return ret; +} + static void http_response(Z_HTTP_Response *hres) { int ret = -1; @@ -4359,7 +4515,11 @@ static void http_response(Z_HTTP_Response *hres) if (!yaz_srw_check_content_type(hres)) printf("Content type does not appear to be XML\n"); - else + else if (!strcmp(webservice_type, "solr")) + { + decode_SOLR_response(hres->content_buf, hres->content_len); + } + else if (!strcmp(webservice_type, "sru")) { Z_SOAP *soap_package = 0; ODR o = odr_createmem(ODR_DECODE); @@ -4511,16 +4671,16 @@ static void wait_and_handle_response(int one_response_only) if (gdu->which == Z_GDU_Z3950) { Z_APDU *apdu = gdu->u.z3950; - switch(apdu->which) + switch (apdu->which) { case Z_APDU_initResponse: - process_initResponse(apdu->u.initResponse); + process_Z3950_initResponse(apdu->u.initResponse); break; case Z_APDU_searchResponse: - process_searchResponse(apdu->u.searchResponse); + process_Z3950_searchResponse(apdu->u.searchResponse); break; case Z_APDU_scanResponse: - process_scanResponse(apdu->u.scanResponse); + process_Z3950_scanResponse(apdu->u.scanResponse); break; case Z_APDU_presentResponse: print_refid(apdu->u.presentResponse->referenceId); @@ -4534,23 +4694,23 @@ static void wait_and_handle_response(int one_response_only) *apdu->u.presentResponse->nextResultSetPosition); break; case Z_APDU_sortResponse: - process_sortResponse(apdu->u.sortResponse); + process_Z3950_sortResponse(apdu->u.sortResponse); break; case Z_APDU_extendedServicesResponse: printf("Got extended services response\n"); - process_ESResponse(apdu->u.extendedServicesResponse); + process_Z3950_ESResponse(apdu->u.extendedServicesResponse); break; case Z_APDU_close: printf("Target has closed the association.\n"); - process_close(apdu->u.close); + process_Z3950_close(apdu->u.close); break; case Z_APDU_resourceControlRequest: - process_resourceControlRequest - (apdu->u.resourceControlRequest); + process_Z3950_resourceControlRequest( + apdu->u.resourceControlRequest); break; case Z_APDU_deleteResultSetResponse: - process_deleteResultSetResponse(apdu->u. - deleteResultSetResponse); + process_Z3950_deleteResultSetResponse( + apdu->u.deleteResultSetResponse); break; default: printf("Received unknown APDU type (%d).\n", @@ -4606,8 +4766,7 @@ static void wait_and_handle_response(int one_response_only) xfree(netbuffer); } - -int cmd_cclparse(const char* arg) +static int cmd_cclparse(const char* arg) { int error, pos; struct ccl_rpn_node *rpn=NULL; @@ -4636,8 +4795,7 @@ int cmd_cclparse(const char* arg) return 0; } - -int cmd_set_otherinfo(const char* args) +static int cmd_set_otherinfo(const char* args) { char oidstr[101], otherinfoString[101]; int otherinfoNo; @@ -4684,7 +4842,7 @@ int cmd_set_otherinfo(const char* args) return 0; } -int cmd_sleep(const char* args ) +static int cmd_sleep(const char* args ) { int sec = atoi(args); if (sec > 0) @@ -4699,7 +4857,7 @@ int cmd_sleep(const char* args ) return 1; } -int cmd_list_otherinfo(const char* args) +static int cmd_list_otherinfo(const char* args) { int i; @@ -4744,8 +4902,7 @@ int cmd_list_otherinfo(const char* args) return 0; } - -int cmd_list_all(const char* args) +static int cmd_list_all(const char* args) { int i; @@ -4818,7 +4975,7 @@ int cmd_list_all(const char* args) return 0; } -int cmd_clear_otherinfo(const char* args) +static int cmd_clear_otherinfo(const char* args) { if (strlen(args) > 0) { @@ -4853,7 +5010,7 @@ int cmd_clear_otherinfo(const char* args) return 0; } -int cmd_wait_response(const char *arg) +static int cmd_wait_response(const char *arg) { int i; int wait_for = atoi(arg); @@ -4954,6 +5111,7 @@ static struct { {"init", cmd_init, "", NULL,0,NULL}, {"sru", cmd_sru, " ", NULL,0,NULL}, {"url", cmd_url, "", NULL,0,NULL}, + {"webservice", cmd_webservice, "", NULL,0,NULL}, {"exit", cmd_quit, "",NULL,0,NULL}, {0,0,0,0,0,0} }; @@ -5017,7 +5175,7 @@ static int cmd_help(const char *line) return 1; } -int cmd_register_tab(const char* arg) +static int cmd_register_tab(const char* arg) { #if HAVE_READLINE_READLINE_H char command[101], tabargument[101]; @@ -5063,8 +5221,7 @@ int cmd_register_tab(const char* arg) return 1; } - -void process_cmd_line(char* line) +static void process_cmd_line(char* line) { int i, res; char word[32], arg[10240]; @@ -5154,7 +5311,7 @@ static char* default_completer(const char* text, int state) /* This function only known how to complete on the first word */ -char **readline_completer(char *text, int start, int end) +static char **readline_completer(char *text, int start, int end) { completerFunctionType completerToUse; @@ -5217,7 +5374,7 @@ char **readline_completer(char *text, int start, int end) #endif #ifndef WIN32 -void ctrl_c_handler(int x) +static void ctrl_c_handler(int x) { exit_client(0); }