X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=client%2Fclient.c;h=21d1650dfd72ba2b8e3246d6f68c40296ab8795a;hp=653ab4138f599ecfe00b9dbe9979c4f31ae4d81a;hb=f22a5e53e3563367b54471bbcff0b544dab81c30;hpb=b23f8886419f5fa9f4a46ba15812ad02d1ca8e55 diff --git a/client/client.c b/client/client.c index 653ab41..21d1650 100644 --- a/client/client.c +++ b/client/client.c @@ -4,7 +4,19 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: client.c,v $ - * Revision 1.82 1999-05-26 13:49:12 adam + * Revision 1.86 1999-07-06 12:13:35 adam + * Added "schema" command. + * + * Revision 1.85 1999/06/16 11:55:24 adam + * Added APDU log to client. + * + * Revision 1.84 1999/06/01 14:29:11 adam + * Work on Extended Services. + * + * Revision 1.83 1999/05/26 15:24:26 adam + * Fixed minor bugs regarding DB Update (introduced by previous commit). + * + * Revision 1.82 1999/05/26 13:49:12 adam * DB Update implemented in client (very basic). * * Revision 1.81 1999/04/20 09:56:48 adam @@ -278,7 +290,6 @@ #include -#include #include #ifdef USE_XTIMOSI #include @@ -304,6 +315,7 @@ #define C_PROMPT "Z> " static ODR out, in, print; /* encoding and decoding streams */ +static FILE *apdu_file = 0; static COMSTACK conn = 0; /* our z-association */ static Z_IdAuthentication *auth = 0; /* our current auth definition */ static char *databaseNames[128]; @@ -317,6 +329,7 @@ static Z_ElementSetNames *elementSetNames = 0; static int setno = 1; /* current set offset */ 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 Z_InitResponse *session = 0; /* session parameters */ @@ -347,6 +360,11 @@ static void send_apdu(Z_APDU *a) odr_perror(out, "Encoding APDU"); exit(1); } + if (apdu_file) + { + z_APDU(print, &a, 0, 0); + odr_reset(print); + } buf = odr_getbuf(out, &len, 0); if (cs_put(conn, buf, len) < 0) { @@ -397,6 +415,7 @@ static void send_initRequest() ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_3); *req->maximumRecordSize = 1024*1024; + *req->preferredMessageSize = 1024*1024; req->idAuthentication = auth; @@ -1126,7 +1145,20 @@ static int process_resourceControlRequest (Z_ResourceControlRequest *req) void process_ESResponse(Z_ExtendedServicesResponse *res) { - printf("process_ESResponse\n"); + printf("process_ESResponse status="); + switch (*res->operationStatus) + { + case Z_ExtendedServicesResponse_done: + printf ("done\n"); + break; + case Z_ExtendedServicesResponse_accepted: + printf ("accepted\n"); + break; + case Z_ExtendedServicesResponse_failure: + printf ("failure\n"); + display_diagrecs(res->diagnostics, res->num_diagnostics); + break; + } } static Z_External *CreateItemOrderExternal(int itemno) @@ -1139,10 +1171,8 @@ static Z_External *CreateItemOrderExternal(int itemno) ItemOrderRequest.value = VAL_ITEMORDER; r->direct_reference = odr_oiddup(out,oid_getoidbyent(&ItemOrderRequest)); - r->indirect_reference = (int *) odr_malloc(out,sizeof(int)); - *r->indirect_reference = 0; - - r->descriptor = "Extended services item order"; + r->indirect_reference = 0; + r->descriptor = 0; r->which = Z_External_itemOrder; @@ -1234,6 +1264,8 @@ static int cmd_update(char *arg) r = req->taskSpecificParameters = (Z_External *) odr_malloc (out, sizeof(*r)); r->direct_reference = odr_oiddup(out,oid); + r->indirect_reference = 0; + r->descriptor = 0; r->which = Z_External_update; r->u.update = (Z_IUUpdate *) odr_malloc(out, sizeof(*r->u.update)); r->u.update->which = Z_IUUpdate_esRequest; @@ -1242,6 +1274,9 @@ static int cmd_update(char *arg) toKeep = r->u.update->u.esRequest->toKeep = (Z_IUOriginPartToKeep *) odr_malloc(out, sizeof(*r->u.update->u.esRequest->toKeep)); toKeep->databaseName = databaseNames[0]; + toKeep->schema = 0; + toKeep->elementSetName = 0; + toKeep->actionQualifier = 0; toKeep->action = (int *) odr_malloc(out, sizeof(*toKeep->action)); *toKeep->action = Z_IUOriginPartToKeep_recordInsert; @@ -1393,9 +1428,53 @@ static int send_presentRequest(char *arg) prefsyn.proto = protocol; prefsyn.oclass = CLASS_RECSYN; prefsyn.value = recordsyntax; - req->preferredRecordSyntax = oid_ent_to_oid(&prefsyn, oid); - - if (elementSetNames) + req->preferredRecordSyntax = + odr_oiddup (out, oid_ent_to_oid(&prefsyn, oid)); + + if (schema != VAL_NONE) + { + oident prefschema; + + prefschema.proto = protocol; + prefschema.oclass = CLASS_SCHEMA; + prefschema.value = schema; + + req->recordComposition = &compo; + compo.which = Z_RecordComp_complex; + compo.u.complex = (Z_CompSpec *) + odr_malloc(out, sizeof(*compo.u.complex)); + compo.u.complex->selectAlternativeSyntax = (bool_t *) + odr_malloc(out, sizeof(bool_t)); + *compo.u.complex->selectAlternativeSyntax = 0; + + compo.u.complex->generic = (Z_Specification *) + odr_malloc(out, sizeof(*compo.u.complex->generic)); + compo.u.complex->generic->schema = (Odr_oid *) + odr_oiddup(out, oid_ent_to_oid(&prefschema, oid)); + if (!compo.u.complex->generic->schema) + { + /* OID wasn't a schema! Try record syntax instead. */ + prefschema.oclass = CLASS_RECSYN; + compo.u.complex->generic->schema = (Odr_oid *) + odr_oiddup(out, oid_ent_to_oid(&prefschema, oid)); + } + if (!elementSetNames) + compo.u.complex->generic->elementSpec = 0; + else + { + compo.u.complex->generic->elementSpec = (Z_ElementSpec *) + odr_malloc(out, sizeof(Z_ElementSpec)); + compo.u.complex->generic->elementSpec->which = + Z_ElementSpec_elementSetName; + compo.u.complex->generic->elementSpec->u.elementSetName = + elementSetNames->u.generic; + } + compo.u.complex->num_dbSpecific = 0; + compo.u.complex->dbSpecific = 0; + compo.u.complex->num_recordSyntax = 0; + compo.u.complex->recordSyntax = 0; + } + else if (elementSetNames) { req->recordComposition = &compo; compo.which = Z_RecordComp_simple; @@ -1771,6 +1850,22 @@ int cmd_scan(char *arg) return 2; } +int cmd_schema(char *arg) +{ + if (!arg || !*arg) + { + schema = VAL_NONE; + return 1; + } + schema = oid_getvalbyname (arg); + if (schema == VAL_NONE) + { + printf ("unknown schema\n"); + return 0; + } + return 1; +} + int cmd_format(char *arg) { if (!arg || !*arg) @@ -1794,8 +1889,8 @@ int cmd_elements(char *arg) if (!arg || !*arg) { - printf("Usage: elements \n"); - return 0; + elementSetNames = 0; + return 1; } strcpy(what, arg); esn.which = Z_ElementSetNames_generic; @@ -1887,6 +1982,8 @@ static void initialize(void) exit(1); } setvbuf(stdout, 0, _IONBF, 0); + if (apdu_file) + odr_setprint(print, apdu_file); #if CCL2RPN bibset = ccl_qual_mk (); @@ -1924,6 +2021,7 @@ static int client(int wait) {"setnames", cmd_setnames, ""}, {"cancel", cmd_cancel, ""}, {"format", cmd_format, ""}, + {"schema", cmd_schema, ""}, {"elements", cmd_elements, ""}, {"close", cmd_close, ""}, {"attributeset", cmd_attributeset, ""}, @@ -2039,14 +2137,12 @@ static int client(int wait) fprintf(stderr, "---------\n"); exit(1); } -#if 0 - if (!z_APDU(print, &apdu, 0)) + if (apdu_file && !z_APDU(print, &apdu, 0, 0)) { odr_perror(print, "Failed to print incoming APDU"); odr_reset(print); continue; } -#endif switch(apdu->which) { case Z_APDU_initResponse: @@ -2108,7 +2204,7 @@ int main(int argc, char **argv) int ret; int opened = 0; - while ((ret = options("m:v:", argv, argc, &arg)) != -2) + while ((ret = options("a:m:v:", argv, argc, &arg)) != -2) { switch (ret) { @@ -2127,11 +2223,18 @@ int main(int argc, char **argv) exit (1); } break; + case 'a': + if (!strcmp(arg, "-")) + apdu_file=stderr; + else + apdu_file=fopen(arg, "a"); + break; case 'v': log_init (log_mask_str(arg), "", NULL); break; default: - fprintf (stderr, "Usage: %s [-m ] []\n", + fprintf (stderr, "Usage: %s [-m ] [ -m ] " + "[]\n", prog); exit (1); }