X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=client%2Fclient.c;h=a2899cf5a644db801c9b42c08fb7965e99a7fe1d;hb=5b690aebb8dc2d05cad8f668de8fd821a1c231fa;hp=98b8bd5e078d5d90d9d71ce2d7869b7eaa5630f3;hpb=f5235f6ab427d98731fb5184ac284ac97e1dfb40;p=yaz-moved-to-github.git diff --git a/client/client.c b/client/client.c index 98b8bd5..a2899cf 100644 --- a/client/client.c +++ b/client/client.c @@ -2,12 +2,19 @@ * Copyright (c) 1995-2002, Index Data * See the file LICENSE for details. * - * $Id: client.c,v 1.169 2002-09-17 11:07:30 adam Exp $ + * $Id: client.c,v 1.172 2002-10-04 19:05:36 adam Exp $ */ #include #include #include +#include + +#ifdef WIN32 +#include +#define S_ISREG(x) (x & _S_IFREG) +#define S_ISDIR(x) (x & _S_IFDIR) +#endif #include @@ -49,7 +56,7 @@ static Z_IdAuthentication *auth = 0; /* our current auth definition */ char *databaseNames[128]; int num_databaseNames = 0; static Z_External *record_last = 0; -static int setnumber = -1; /* current result set number */ +static int setnumber = -1; /* current result set number */ static int smallSetUpperBound = 0; static int largeSetLowerBound = 1; static int mediumSetPresentNumber = 0; @@ -59,7 +66,7 @@ static enum oid_proto protocol = PROTO_Z3950; /* current app protocol */ static enum oid_value recordsyntax = VAL_USMARC; static enum oid_value schema = VAL_NONE; static int sent_close = 0; -static NMEM session_mem = NULL; /* memory handle for init-response */ +static NMEM session_mem = NULL; /* memory handle for init-response */ static Z_InitResponse *session = 0; /* session parameters */ static char last_scan_line[512] = "0"; static char last_scan_query[512] = "0"; @@ -106,7 +113,7 @@ int rl_attempted_completion_over = 0; #define maxOtherInfosSupported 10 struct { int oidval; - char* value; + char* value; } extraOtherInfos[maxOtherInfosSupported]; @@ -357,16 +364,16 @@ static int process_initResponse(Z_InitResponse *res) yaz_get_charneg_record(res->otherInfo); if (p) { - - char *charset=NULL, *lang=NULL; - int selected; - - yaz_get_response_charneg(session_mem, p, &charset, &lang, + + char *charset=NULL, *lang=NULL; + int selected; + + yaz_get_response_charneg(session_mem, p, &charset, &lang, &selected); - - printf("Accepted character set : %s\n", charset); - printf("Accepted code language : %s\n", lang ? lang : "none"); - printf("Accepted records in ...: %d\n", selected ); + + printf("Accepted character set : %s\n", charset); + printf("Accepted code language : %s\n", lang ? lang : "none"); + printf("Accepted records in ...: %d\n", selected ); } } fflush (stdout); @@ -695,7 +702,7 @@ static void display_record(Z_External *r) r->u.octet_aligned->len); fprintf(stderr, "---------\n"); - /* note just ignores the error ant print the bytes form the octet_aligned laiter */ + /* note just ignores the error ant print the bytes form the octet_aligned later */ } else { /* * Note: we throw away the original, BER-encoded record here. @@ -1536,11 +1543,64 @@ static int cmd_update(char *arg) Z_IUOriginPartToKeep *toKeep; Z_IUSuppliedRecords *notToKeep; oident update_oid; - printf ("Update request\n"); - fflush(stdout); - - if (!record_last) + char action[20], recid[20], fname[80]; + int action_no; + Z_External *record_this = 0; + + *action = 0; + *recid = 0; + *fname = 0; + sscanf (arg, "%19s %19s %79s", action, recid, fname); + + if (!strcmp (action, "insert")) + action_no = Z_IUOriginPartToKeep_recordInsert; + else if (!strcmp (action, "replace")) + action_no = Z_IUOriginPartToKeep_recordReplace; + else if (!strcmp (action, "delete")) + action_no = Z_IUOriginPartToKeep_recordDelete; + else if (!strcmp (action, "update")) + action_no = Z_IUOriginPartToKeep_specialUpdate; + else + { + printf ("Bad action: %s\n", action); + printf ("Possible values: insert, replace, delete, update\n"); return 0; + } + + if (*fname) + { + FILE *inf; + struct stat status; + stat (fname, &status); + if (S_ISREG(status.st_mode) && (inf = fopen(fname, "r"))) + { + size_t len = status.st_size; + char *buf = (char *) xmalloc (len); + + fread (buf, 1, len, inf); + + fclose (inf); + + record_this = z_ext_record (out, VAL_TEXT_XML, buf, len); + + xfree (buf); + } + else + { + printf ("File %s doesn't exist\n", fname); + return 0; + } + } + else + { + if (!record_last) + { + printf ("No last record (update ignored)\n"); + return 0; + } + record_this = record_last; + } + update_oid.proto = PROTO_Z3950; update_oid.oclass = CLASS_EXTSERV; update_oid.value = VAL_DBUPDATE; @@ -1567,7 +1627,7 @@ static int cmd_update(char *arg) toKeep->elementSetName = 0; toKeep->actionQualifier = 0; toKeep->action = (int *) odr_malloc(out, sizeof(*toKeep->action)); - *toKeep->action = Z_IUOriginPartToKeep_recordInsert; + *toKeep->action = action_no; notToKeep = r->u.update->u.esRequest->notToKeep = (Z_IUSuppliedRecords *) odr_malloc(out, sizeof(*r->u.update->u.esRequest->notToKeep)); @@ -1576,10 +1636,20 @@ static int cmd_update(char *arg) odr_malloc(out, sizeof(*notToKeep->elements)); notToKeep->elements[0] = (Z_IUSuppliedRecords_elem *) odr_malloc(out, sizeof(**notToKeep->elements)); - notToKeep->elements[0]->u.number = 0; + notToKeep->elements[0]->which = Z_IUSuppliedRecords_elem_opaque; + if (*recid) + { + notToKeep->elements[0]->u.opaque = (Odr_oct *) + odr_malloc (out, sizeof(Odr_oct)); + notToKeep->elements[0]->u.opaque->buf = (unsigned char *) recid; + notToKeep->elements[0]->u.opaque->size = strlen(recid); + notToKeep->elements[0]->u.opaque->len = strlen(recid); + } + else + notToKeep->elements[0]->u.opaque = 0; notToKeep->elements[0]->supplementalId = 0; notToKeep->elements[0]->correlationInfo = 0; - notToKeep->elements[0]->record = record_last; + notToKeep->elements[0]->record = record_this; send_apdu(apdu); @@ -2476,7 +2546,7 @@ int cmd_register_oid(char* args) { {"schema",CLASS_SCHEMA}, {"tagset",CLASS_TAGSET}, {"general",CLASS_GENERAL}, - {0,0} + {0,(enum oid_class) 0} }; char oname_str[101], oclass_str[101], oid_str[101]; char* name; @@ -2798,12 +2868,22 @@ int cmd_list_otherinfo(char* args) } if(extraOtherInfos[i].oidval != -1) - printf(" otherinfo %d %s %s\n",i,yaz_z3950_oid_value_to_str(extraOtherInfos[i].oidval,CLASS_RECSYN), extraOtherInfos[i].value); + printf(" otherinfo %d %s %s\n", + i, + yaz_z3950_oid_value_to_str( + (enum oid_value) extraOtherInfos[i].oidval, + CLASS_RECSYN), + extraOtherInfos[i].value); } else { for(i=0; i",complete_querytype,0,NULL}, {"refid", cmd_refid, "",NULL,0,NULL}, {"itemorder", cmd_itemorder, "ill|item ",NULL,0,NULL}, - {"update", cmd_update, "",NULL,0,NULL}, + {"update", cmd_update, " []",NULL,0,NULL}, {"packagename", cmd_packagename, "",NULL,0,NULL}, {"proxy", cmd_proxy, "[('tcp'|'ssl')][':']",NULL,0,NULL}, {"charset", cmd_charset, "",NULL,0,NULL}, @@ -3038,11 +3118,9 @@ int cmd_register_tab(char* arg) { return 1; } - - - if(!cmd[i].local_tabcompletes) { - cmd[i].local_tabcompletes = calloc(1,sizeof(char**)); - } + + if(!cmd[i].local_tabcompletes) + cmd[i].local_tabcompletes = (char **) calloc(1,sizeof(char**)); num_of_tabs=0; @@ -3051,7 +3129,8 @@ int cmd_register_tab(char* arg) { num_of_tabs++; } - cmd[i].local_tabcompletes=realloc(cmd[i].local_tabcompletes,(num_of_tabs+2)*sizeof(char**)); + cmd[i].local_tabcompletes = (char **) + realloc(cmd[i].local_tabcompletes,(num_of_tabs+2)*sizeof(char**)); tabslist=cmd[i].local_tabcompletes; tabslist[num_of_tabs]=strdup(tabargument); tabslist[num_of_tabs+1]=NULL;