X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=client%2Fclient.c;h=811d9573ff2fa6657cc00797dd1646018361d8ae;hp=c158b00acb45c749c94b037c0bda9274679e5b25;hb=a4d9a7973644a72d521b462df6cad688e526d27c;hpb=a92ea4f2be422ed5f52f0fc1c8b6416aebfe0c5a diff --git a/client/client.c b/client/client.c index c158b00..811d957 100644 --- a/client/client.c +++ b/client/client.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2007, Index Data ApS * See the file LICENSE for details. * - * $Id: client.c,v 1.350 2007-08-21 13:19:44 adam Exp $ + * $Id: client.c,v 1.356 2007-12-27 13:27:40 adam Exp $ */ /** \file client.c * \brief yaz-client program @@ -90,7 +90,8 @@ static file_history_t file_history = 0; -static char *sru_method = "soap"; +static char sru_method[10] = "soap"; +static char sru_version[10] = "1.2"; static char *codeset = 0; /* character set for output */ static int hex_dump = 0; static char *dump_file_prefix = 0; @@ -597,29 +598,27 @@ static int set_base(const char *arg) return 1; } -static int parse_cmd_doc(const char **arg, ODR out, char **buf, - int *len, int opt) +static int parse_cmd_doc(const char **arg, ODR out, char **buf, int *len) { const char *sep; while (**arg && strchr(" \t\n\r\f", **arg)) (*arg)++; - if ((*arg)[0] == '\"' && (sep=strchr(*arg+1, '"'))) + if (**arg == '\0') { - (*arg)++; - *len = sep - *arg; - *buf = odr_strdupn(out, *arg, *len); - (*arg) = sep+1; - return 1; + return 0; } - else if ((*arg)[0] && (*arg)[0] != '\"') + else if ((*arg)[0] == '<') { long fsize; FILE *inf; - const char *fname = *arg; - + const char *fname; + const char *arg_start = ++(*arg); + while (**arg != '\0' && **arg != ' ') (*arg)++; + fname = odr_strdupn(out, arg_start, *arg - arg_start); + inf = fopen(fname, "rb"); if (!inf) { @@ -640,7 +639,8 @@ static int parse_cmd_doc(const char **arg, ODR out, char **buf, return 0; } *len = fsize; - *buf = (char *) odr_malloc(out, fsize); + *buf = (char *) odr_malloc(out, fsize+1); + (*buf)[fsize] = '\0'; if (fread(*buf, 1, fsize, inf) != fsize) { printf("Unable to read %s\n", fname); @@ -648,21 +648,25 @@ static int parse_cmd_doc(const char **arg, ODR out, char **buf, return 0; } fclose(inf); - return 1; } - else if (**arg == '\0') + else if ((*arg)[0] == '\"' && (sep=strchr(*arg+1, '"'))) { - if (opt) - { - *len = 0; - *buf = 0; - return 1; - } - printf("Missing doc argument\n"); + (*arg)++; + *len = sep - *arg; + *buf = odr_strdupn(out, *arg, *len); + (*arg) = sep+1; } else - printf("Bad doc argument %s\n", *arg); - return 0; + { + const char *arg_start = *arg; + + while (**arg != '\0' && **arg != ' ') + (*arg)++; + + *len = *arg - arg_start; + *buf = odr_strdupn(out, arg_start, *len); + } + return 1; } static int cmd_base(const char *arg) @@ -720,8 +724,6 @@ int session_connect(const char *arg) return 0; } #if YAZ_HAVE_XML2 - if (conn->protocol == PROTO_HTTP) - queryType = QueryType_CQL; #else if (conn->protocol == PROTO_HTTP) { @@ -782,12 +784,16 @@ int session_connect(const char *arg) int cmd_open(const char *arg) { + int r; if (arg) { strncpy (cur_host, arg, sizeof(cur_host)-1); cur_host[sizeof(cur_host)-1] = 0; } - return session_connect(cur_host); + r = session_connect(cur_host); + if (conn && conn->protocol == PROTO_HTTP) + queryType = QueryType_CQL; + return r; } void try_reconnect(void) @@ -843,8 +849,8 @@ int cmd_authentication(const char *arg) au.which = Z_IdAuthentication_idPass; au.u.idPass = &idPass; idPass.groupId = NULL; - idPass.userId = user; - idPass.password = group; + idPass.userId = !strcmp(user, "-") ? 0 : user; + idPass.password = !strcmp(group, "-") ? 0 : group; printf("Authentication set to User (%s), Pass (%s)\n", user, group); } if (r == 3) @@ -1273,15 +1279,15 @@ static int send_srw(Z_SRW_PDU *sr) gdu = z_get_HTTP_Request_host_path(out, host_port, path); - if (!strcmp(sru_method, "get")) + if (!yaz_matchstr(sru_method, "get")) { yaz_sru_get_encode(gdu->u.HTTP_Request, sr, out, charset); } - else if (!strcmp(sru_method, "post")) + else if (!yaz_matchstr(sru_method, "post")) { yaz_sru_post_encode(gdu->u.HTTP_Request, sr, out, charset); } - else if (!strcmp(sru_method, "soap")) + else if (!yaz_matchstr(sru_method, "soap")) { yaz_sru_soap_encode(gdu->u.HTTP_Request, sr, out, charset); } @@ -1344,7 +1350,7 @@ static int send_SRW_scanRequest(const char *arg, int pos, int num) Z_SRW_PDU *sr = 0; /* regular requestse .. */ - sr = yaz_srw_get(out, Z_SRW_scan_request); + sr = yaz_srw_get_pdu(out, Z_SRW_scan_request, sru_version); switch(queryType) { @@ -1379,10 +1385,11 @@ static int send_SRW_searchRequest(const char *arg) setno = 1; /* save this for later .. when fetching individual records */ - srw_sr = yaz_srw_get(srw_sr_odr_out, Z_SRW_searchRetrieve_request); + srw_sr = yaz_srw_get_pdu(srw_sr_odr_out, Z_SRW_searchRetrieve_request, + sru_version); /* regular request .. */ - sr = yaz_srw_get(out, Z_SRW_searchRetrieve_request); + sr = yaz_srw_get_pdu(out, Z_SRW_searchRetrieve_request, sru_version); switch(queryType) { @@ -1918,16 +1925,30 @@ void process_ESResponse(Z_ExtendedServicesResponse *res) if (ext->which == Z_External_itemOrder) { Z_IOTaskPackage *otp = ext->u.itemOrder->u.taskPackage; - if (otp && otp->targetPart && otp->targetPart->itemRequest) + + if (otp && otp->targetPart ) { - Z_External *ext = otp->targetPart->itemRequest; - if (ext->which == Z_External_octet) + if (otp->targetPart->itemRequest) { - Odr_oct *doc = ext->u.octet_aligned; - printf("Got itemRequest doc %.*s\n", - doc->len, doc->buf); + Z_External *ext = otp->targetPart->itemRequest; + if (ext->which == Z_External_octet) + { + Odr_oct *doc = ext->u.octet_aligned; + printf("Got itemRequest doc %.*s\n", + doc->len, doc->buf); + } } - } + else if (otp->targetPart->statusOrErrorReport) + { + Z_External *ext = otp->targetPart->statusOrErrorReport; + if (ext->which == Z_External_octet) + { + Odr_oct *doc = ext->u.octet_aligned; + printf("Got Status or Error Report doc %.*s\n", + doc->len, doc->buf); + } + } + } } } if (res->taskPackage && res->taskPackage->which == Z_External_octet) @@ -2048,7 +2069,9 @@ static Z_External *create_external_ILL_APDU(int which) } -static Z_External *create_ItemOrderExternal(const char *type, int itemno) +static Z_External *create_ItemOrderExternal(const char *type, int itemno, + const char *xml_buf, + int xml_len) { Z_External *r = (Z_External *) odr_malloc(out, sizeof(Z_External)); r->direct_reference = odr_oiddup(out, yaz_oid_extserv_item_order); @@ -2099,14 +2122,18 @@ static Z_External *create_ItemOrderExternal(const char *type, int itemno) } else if (!strcmp(type, "xml") || !strcmp(type, "3")) { - const char *xml_buf = - "\n" - " request\n" - " 000200\n" - " 1212 \n" - ""; - r->u.itemOrder->u.esRequest->notToKeep->itemRequest = - z_ext_record_oid(out, yaz_oid_recsyn_xml, xml_buf, strlen(xml_buf)); + printf("using XML ILL-request\n"); + + if (!xml_buf) + { + printf("no docoument added\n"); + r->u.itemOrder->u.esRequest->notToKeep->itemRequest = 0; + } + else + { + r->u.itemOrder->u.esRequest->notToKeep->itemRequest = + z_ext_record_oid(out, yaz_oid_recsyn_xml, xml_buf, xml_len); + } } else r->u.itemOrder->u.esRequest->notToKeep->itemRequest = 0; @@ -2114,7 +2141,8 @@ static Z_External *create_ItemOrderExternal(const char *type, int itemno) return r; } -static int send_itemorder(const char *type, int itemno) +static int send_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; @@ -2124,8 +2152,8 @@ static int send_itemorder(const char *type, int itemno) req->packageType = odr_oiddup(out, yaz_oid_extserv_item_order); req->packageName = esPackageName; - req->taskSpecificParameters = create_ItemOrderExternal(type, itemno); - + req->taskSpecificParameters = create_ItemOrderExternal(type, itemno, + xml_buf, xml_len); send_apdu(apdu); return 0; } @@ -2165,17 +2193,17 @@ static int cmd_update_SRW(int action_no, const char *recid, static int cmd_update_common(const char *arg, int version) { - char action[20], recid_buf[20]; + char *action_buf; + int action_len; + char *recid_buf; + int recid_len; const char *recid = 0; char *rec_buf; int rec_len; int action_no; int noread = 0; - *action = 0; - *recid_buf = 0; - sscanf (arg, "%19s %19s%n", action, recid_buf, &noread); - if (noread == 0) + if (parse_cmd_doc(&arg, out, &action_buf, &action_len) == 0) { printf("Use: update action recid [fname]\n"); printf(" where action is one of insert,replace,delete.update\n"); @@ -2184,17 +2212,23 @@ static int cmd_update_common(const char *arg, int version) return 0; } - if (!strcmp (action, "insert")) + if (parse_cmd_doc(&arg, out, &recid_buf, &recid_len) == 0) + { + printf("Missing recid\n"); + return 0; + } + + if (!strcmp(action_buf, "insert")) action_no = Z_IUOriginPartToKeep_recordInsert; - else if (!strcmp (action, "replace")) + else if (!strcmp(action_buf, "replace")) action_no = Z_IUOriginPartToKeep_recordReplace; - else if (!strcmp (action, "delete")) + else if (!strcmp(action_buf, "delete")) action_no = Z_IUOriginPartToKeep_recordDelete; - else if (!strcmp (action, "update")) + else if (!strcmp(action_buf, "update")) action_no = Z_IUOriginPartToKeep_specialUpdate; else { - printf ("Bad action: %s\n", action); + printf ("Bad action: %s\n", action_buf); printf ("Possible values: insert, replace, delete, update\n"); return 0; } @@ -2203,14 +2237,14 @@ static int cmd_update_common(const char *arg, int version) recid = recid_buf; arg += noread; - if (parse_cmd_doc(&arg, out, &rec_buf, &rec_len, 1) == 0) + if (parse_cmd_doc(&arg, out, &rec_buf, &rec_len) == 0) return 0; #if YAZ_HAVE_XML2 if (protocol == PROTO_HTTP) - return cmd_update_SRW(action_no, recid, rec_buf, rec_len); + return cmd_update_SRW(action_no, recid_buf, rec_buf, rec_len); #endif - return cmd_update_Z3950(version, action_no, recid, rec_buf, rec_len); + return cmd_update_Z3950(version, action_no, recid_buf, rec_buf, rec_len); } #if YAZ_HAVE_XML2 @@ -2218,7 +2252,7 @@ static int cmd_update_SRW(int action_no, const char *recid, char *rec_buf, int rec_len) { if (!conn) - cmd_open(0); + session_connect(cur_host); if (!conn) return 0; else @@ -2300,6 +2334,12 @@ static int cmd_update_Z3950(int version, int action_no, const char *recid, toKeep->databaseName = databaseNames[0]; toKeep->schema = 0; + if (record_schema) + { + toKeep->schema = yaz_string_to_oid_odr(yaz_oid_std(), + CLASS_SCHEMA, + record_schema, out); + } toKeep->elementSetName = 0; toKeep->action = (int *) odr_malloc(out, sizeof(*toKeep->action)); @@ -2342,6 +2382,12 @@ static int cmd_update_Z3950(int version, int action_no, const char *recid, toKeep->databaseName = databaseNames[0]; toKeep->schema = 0; + if (record_schema) + { + toKeep->schema = yaz_string_to_oid_odr(yaz_oid_std(), + CLASS_SCHEMA, + record_schema, out); + } toKeep->elementSetName = 0; toKeep->actionQualifier = 0; toKeep->action = (int *) odr_malloc(out, sizeof(*toKeep->action)); @@ -2405,7 +2451,7 @@ static int cmd_xmles(const char *arg) } arg += noread; if (parse_cmd_doc(&arg, out, &asn_buf, - &ext->u.single_ASN1_type->len, 0) == 0) + &ext->u.single_ASN1_type->len) == 0) return 0; ext->u.single_ASN1_type->buf = (unsigned char *) asn_buf; @@ -2432,15 +2478,19 @@ static int cmd_itemorder(const char *arg) { char type[12]; int itemno; + char *xml_buf = 0; + int xml_len = 0; + int no_read = 0; if (only_z3950()) return 1; - if (sscanf (arg, "%10s %d", type, &itemno) != 2) + if (sscanf(arg, "%10s %d%n", type, &itemno, &no_read) < 2) return 0; + arg += no_read; + parse_cmd_doc(&arg, out, &xml_buf, &xml_len); - printf("Item order request\n"); fflush(stdout); - send_itemorder(type, itemno); + send_itemorder(type, itemno, xml_buf, xml_len); return 2; } @@ -2482,7 +2532,7 @@ static int cmd_explain(const char *arg) return 0; #if YAZ_HAVE_XML2 if (!conn) - cmd_open(0); + session_connect(cur_host); if (conn) { Z_SRW_PDU *sr = 0; @@ -2519,19 +2569,26 @@ static int cmd_sru(const char *arg) if (!*arg) { printf("SRU method is: %s\n", sru_method); + printf("SRU version is: %s\n", sru_version); } else { - if (!yaz_matchstr(arg, "post")) - sru_method = "post"; - else if (!yaz_matchstr(arg, "get")) - sru_method = "get"; - else if (!yaz_matchstr(arg, "soap")) - sru_method = "soap"; - else + int r; + r = sscanf(arg, "%9s %9s", sru_method, sru_version); + if (r >= 1) { - printf("Unknown SRU method: %s\n", arg); - printf("Specify one of POST, GET, SOAP\n"); + if (!yaz_matchstr(sru_method, "post")) + ; + else if (!yaz_matchstr(sru_method, "get")) + ; + else if (!yaz_matchstr(sru_method, "soap")) + ; + else + { + strcpy(sru_method, "soap"); + printf("Unknown SRU method: %s\n", arg); + printf("Specify one of POST, GET, SOAP\n"); + } } } return 0; @@ -2548,7 +2605,7 @@ static int cmd_find(const char *arg) { #if YAZ_HAVE_XML2 if (!conn) - cmd_open(0); + session_connect(cur_host); if (!conn) return 0; if (!send_SRW_searchRequest(arg)) @@ -2825,7 +2882,7 @@ static int cmd_show(const char *arg) { #if YAZ_HAVE_XML2 if (!conn) - cmd_open(0); + session_connect(cur_host); if (!conn) return 0; if (!send_SRW_presentRequest(arg)) @@ -3172,7 +3229,7 @@ static int cmd_scan_common(const char *set, const char *arg) { #if YAZ_HAVE_XML2 if (!conn) - cmd_open(0); + session_connect(cur_host); if (!conn) return 0; if (*arg) @@ -4053,7 +4110,7 @@ void wait_and_handle_response(int one_response_only) { cs_close(conn); conn = 0; - cmd_open(0); + session_connect(cur_host); reconnect_ok = 0; if (conn) { @@ -4530,7 +4587,7 @@ static struct { {"zversion", cmd_zversion, "", NULL, 0, NULL}, {"help", cmd_help, "", NULL,0,NULL}, {"init", cmd_init, "", NULL,0,NULL}, - {"sru", cmd_sru, "", NULL,0,NULL}, + {"sru", cmd_sru, " ", NULL,0,NULL}, {"exit", cmd_quit, "",NULL,0,NULL}, {0,0,0,0,0,0} };