From a6eef2e7073a7295d1a7bf09f538946135a5ebbb Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Mon, 20 Mar 2000 19:06:25 +0000 Subject: [PATCH 1/1] Added Segment request for fronend server. Work on admin for client. --- client/admin.c | 194 +++++++++++++++++++++++++++++++++++-------------- client/client.c | 13 +++- include/yaz/backend.h | 15 +++- server/seshigh.c | 132 ++++++++++++++++++++------------- server/session.h | 6 +- server/statserv.c | 16 +++- zutil/diagbib1.c | 7 +- zutil/zget.c | 7 +- 8 files changed, 276 insertions(+), 114 deletions(-) diff --git a/client/admin.c b/client/admin.c index 7f9fca7..a2873fa 100644 --- a/client/admin.c +++ b/client/admin.c @@ -1,6 +1,9 @@ /* * $Log: admin.c,v $ - * Revision 1.5 2000-03-17 12:47:02 adam + * Revision 1.6 2000-03-20 19:06:25 adam + * Added Segment request for fronend server. Work on admin for client. + * + * Revision 1.5 2000/03/17 12:47:02 adam * Minor changes to admin client. * * Revision 1.4 2000/03/16 13:55:49 ian @@ -22,7 +25,10 @@ #include #include #include - +#include +#include +#include +#include #include #include @@ -80,65 +86,54 @@ int sendAdminES(int type, char* dbname, char* param1) odr_malloc(out, sizeof(*r->u.adminService->u.esRequest->toKeep)); toKeep->which=type; - + toKeep->databaseName = dbname; switch ( type ) { - case Z_ESAdminOriginPartToKeep_reIndex: - toKeep->u.reIndex=odr_nullval(); - toKeep->databaseName = dbname; - break; - - case Z_ESAdminOriginPartToKeep_truncate: - toKeep->u.truncate=odr_nullval(); - toKeep->databaseName = dbname; - break; - - case Z_ESAdminOriginPartToKeep_delete: - toKeep->u.delete=odr_nullval(); - toKeep->databaseName = dbname; - break; - - case Z_ESAdminOriginPartToKeep_create: - toKeep->u.create=odr_nullval(); - toKeep->databaseName = dbname; - break; - - case Z_ESAdminOriginPartToKeep_import: - toKeep->u.import = (Z_ImportParameters*)odr_malloc(out, sizeof(*toKeep->u.import)); - toKeep->u.import->recordType=param1; - toKeep->databaseName = dbname; - /* Need to add additional setup of records here */ - break; - - case Z_ESAdminOriginPartToKeep_refresh: - toKeep->u.refresh=odr_nullval(); - toKeep->databaseName = dbname; - break; - - case Z_ESAdminOriginPartToKeep_commit: - toKeep->u.commit=odr_nullval(); - break; - - case Z_ESAdminOriginPartToKeep_shutdown: - toKeep->u.commit=odr_nullval(); - break; - - case Z_ESAdminOriginPartToKeep_start: - toKeep->u.commit=odr_nullval(); - break; - - default: - /* Unknown admin service */ - break; + case Z_ESAdminOriginPartToKeep_reIndex: + toKeep->u.reIndex=odr_nullval(); + break; + + case Z_ESAdminOriginPartToKeep_truncate: + toKeep->u.truncate=odr_nullval(); + break; + case Z_ESAdminOriginPartToKeep_delete: + toKeep->u.delete=odr_nullval(); + break; + case Z_ESAdminOriginPartToKeep_create: + toKeep->u.create=odr_nullval(); + break; + case Z_ESAdminOriginPartToKeep_import: + toKeep->u.import = (Z_ImportParameters*)odr_malloc(out, sizeof(*toKeep->u.import)); + toKeep->u.import->recordType=param1; + toKeep->databaseName = dbname; + /* Need to add additional setup of records here */ + break; + case Z_ESAdminOriginPartToKeep_refresh: + toKeep->u.refresh=odr_nullval(); + toKeep->databaseName = dbname; + break; + case Z_ESAdminOriginPartToKeep_commit: + toKeep->u.commit=odr_nullval(); + break; + case Z_ESAdminOriginPartToKeep_shutdown: + toKeep->u.commit=odr_nullval(); + break; + case Z_ESAdminOriginPartToKeep_start: + toKeep->u.commit=odr_nullval(); + break; + default: + /* Unknown admin service */ + break; } - notToKeep = r->u.adminService->u.esRequest->notToKeep = (Z_ESAdminOriginPartNotToKeep *) + notToKeep = r->u.adminService->u.esRequest->notToKeep = + (Z_ESAdminOriginPartNotToKeep *) odr_malloc(out, sizeof(*r->u.adminService->u.esRequest->notToKeep)); notToKeep->which=Z_ESAdminOriginPartNotToKeep_recordsWillFollow; notToKeep->u.recordsWillFollow=odr_nullval(); send_apdu(apdu); - + return 0; } @@ -191,14 +186,105 @@ int cmd_adm_delete(char* arg) Import the specified updated into the database N.B. That in this case, the import may contain instructions to delete records as well as new or updates to existing records */ -int cmd_adm_import(char* arg) + +extern char *databaseNames[]; +extern int num_databaseNames; + +int cmd_adm_import(char *arg) +{ + char type_str[20], dir_str[1024], pattern_str[1024]; + char *cp; + char *sep = "/"; + DIR *dir; + struct dirent *ent; + int chunk = 10; + Z_APDU *apdu = 0; + ODR out = getODROutputStream(); + + if (arg && sscanf (arg, "%19s %1023s %1023s", type_str, + dir_str, pattern_str) != 3) + return 0; + if (num_databaseNames != 1) + return 0; + dir = opendir(dir_str); + if (!dir) + return 0; + + sendAdminES(Z_ESAdminOriginPartToKeep_import,*databaseNames, + type_str); + + printf ("sent es request\n"); + if ((cp=strrchr(dir_str, '/')) && cp[1] == 0) + sep=""; + + while ((ent = readdir(dir))) + { + if (fnmatch (pattern_str, ent->d_name, 0) == 0) + { + char fname[1024]; + struct stat status; + FILE *inf; + + sprintf (fname, "%s%s%s", dir_str, sep, ent->d_name); + stat (fname, &status); + + if (S_ISREG(status.st_mode) && (inf = fopen(fname, "r"))) + { + Z_Segment *segment; + Z_NamePlusRecord *rec; + Odr_oct *oct = odr_malloc (out, sizeof(*oct)); + + if (!apdu) + { + apdu = zget_APDU(out, Z_APDU_segmentRequest); + segment = apdu->u.segmentRequest; + segment->segmentRecords = (Z_NamePlusRecord **) + odr_malloc (out, chunk * sizeof(*segment->segmentRecords)); + } + rec = (Z_NamePlusRecord *) odr_malloc (out, sizeof(*rec)); + rec->databaseName = 0; + rec->which = Z_NamePlusRecord_intermediateFragment; + rec->u.intermediateFragment = (Z_FragmentSyntax *) + odr_malloc (out, sizeof(*rec->u.intermediateFragment)); + rec->u.intermediateFragment->which = + Z_FragmentSyntax_notExternallyTagged; + rec->u.intermediateFragment->u.notExternallyTagged = oct; + + oct->len = oct->size = status.st_size; + oct->buf = odr_malloc (out, oct->size); + fread (oct->buf, 1, oct->size, inf); + fclose (inf); + + segment->segmentRecords[segment->num_segmentRecords++] = rec; + + if (segment->num_segmentRecords == chunk) + { + send_apdu (apdu); + apdu = 0; + } + } + } + } + if (apdu) + { + printf ("sending last packet\n"); + send_apdu(apdu); + } + apdu = zget_APDU(out, Z_APDU_segmentRequest); + printf ("sending end of sequence packet\n"); + send_apdu (apdu); + closedir(dir); + return 2; +} + +int cmd_adm_import2(char* arg) { /* Size of chunks we wish to read from import file */ size_t chunk_size = 8192; /* Buffer for reading chunks of data from import file */ char chunk_buffer[chunk_size]; - + if ( arg ) { char dbname_buff[32]; diff --git a/client/client.c b/client/client.c index f9350b8..2dae9b3 100644 --- a/client/client.c +++ b/client/client.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: client.c,v $ - * Revision 1.98 2000-03-16 13:55:49 ian + * Revision 1.99 2000-03-20 19:06:25 adam + * Added Segment request for fronend server. Work on admin for client. + * + * Revision 1.98 2000/03/16 13:55:49 ian * Added commands for sending shutdown and startup admin requests via the admin ES. * * Revision 1.97 2000/03/14 14:06:04 ian @@ -363,9 +366,9 @@ 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]; +char *databaseNames[128]; +int num_databaseNames = 0; static Z_External *record_last = 0; -static int num_databaseNames = 0; static int setnumber = 0; /* current result set number */ static int smallSetUpperBound = 0; static int largeSetLowerBound = 1; @@ -2358,9 +2361,11 @@ static int client(int wait) } } wait = 0; + if (conn #ifdef USE_SELECT - if (conn && FD_ISSET(cs_fileno(conn), &input)) + && FD_ISSET(cs_fileno(conn), &input) #endif + ) { do { diff --git a/include/yaz/backend.h b/include/yaz/backend.h index 214f3e6..1a9a21e 100644 --- a/include/yaz/backend.h +++ b/include/yaz/backend.h @@ -24,7 +24,10 @@ * OF THIS SOFTWARE. * * $Log: backend.h,v $ - * Revision 1.5 2000-03-15 12:59:49 adam + * Revision 1.6 2000-03-20 19:06:25 adam + * Added Segment request for fronend server. Work on admin for client. + * + * Revision 1.5 2000/03/15 12:59:49 adam * Added handle member to statserv_control. * * Revision 1.4 2000/02/28 11:20:06 adam @@ -289,6 +292,15 @@ typedef struct bend_esrequest_rr char *errstring; /* system error string or NULL */ } bend_esrequest_rr; +typedef struct bend_segment_rr { + Z_Segment *segment; + ODR stream; + ODR decode; + ODR print; + bend_request request; + bend_association association; +} bend_segment_rr; + typedef struct bend_initrequest { Z_IdAuthentication *auth; @@ -304,6 +316,7 @@ typedef struct bend_initrequest int (*bend_esrequest) (void *handle, bend_esrequest_rr *rr); int (*bend_delete)(void *handle, bend_delete_rr *rr); int (*bend_scan)(void *handle, bend_scan_rr *rr); + int (*bend_segment)(void *handle, bend_segment_rr *rr); } bend_initrequest; typedef struct bend_initresult diff --git a/server/seshigh.c b/server/seshigh.c index ee0f7f2..92ff44a 100644 --- a/server/seshigh.c +++ b/server/seshigh.c @@ -3,7 +3,10 @@ * See the file LICENSE for details. * * $Log: seshigh.c,v $ - * Revision 1.102 2000-03-15 12:59:49 adam + * Revision 1.103 2000-03-20 19:06:25 adam + * Added Segment request for fronend server. Work on admin for client. + * + * Revision 1.102 2000/03/15 12:59:49 adam * Added handle member to statserv_control. * * Revision 1.101 2000/01/12 14:36:07 adam @@ -384,6 +387,7 @@ static void process_close(association *assoc, request *reqb); void save_referenceId (request *reqb, Z_ReferenceId *refid); static Z_APDU *process_deleteRequest(association *assoc, request *reqb, int *fd); +static Z_APDU *process_segmentRequest (association *assoc, request *reqb); static int bend_default_scan (void *handle, bend_scan_rr *rr); static FILE *apduf = 0; /* for use in static mode */ @@ -655,59 +659,70 @@ static int process_request(association *assoc, request *req, char **msg) int fd = -1; Z_APDU *res; int retval; - + *msg = "Unknown Error"; assert(req && req->state == REQUEST_IDLE); switch (req->request->which) { - case Z_APDU_initRequest: - res = process_initRequest(assoc, req); break; - case Z_APDU_searchRequest: - res = process_searchRequest(assoc, req, &fd); break; - case Z_APDU_presentRequest: - res = process_presentRequest(assoc, req, &fd); break; - case Z_APDU_scanRequest: - if (assoc->bend_scan) - res = process_scanRequest(assoc, req, &fd); - else - { - *msg = "Cannot handle Scan APDU"; - return -1; - } - break; - case Z_APDU_extendedServicesRequest: - if (assoc->bend_esrequest) - res = process_ESRequest(assoc, req, &fd); - else - { - *msg = "Cannot handle Extended Services APDU"; - return -1; - } - break; - case Z_APDU_sortRequest: - if (assoc->bend_sort) - res = process_sortRequest(assoc, req, &fd); - else - { - *msg = "Cannot handle Sort APDU"; - return -1; - } - break; - case Z_APDU_close: - process_close(assoc, req); - return 0; - case Z_APDU_deleteResultSetRequest: - if (assoc->bend_delete) - res = process_deleteRequest(assoc, req, &fd); - else - { - *msg = "Cannot handle Delete APDU"; - return -1; - } - break; - default: - *msg = "Bad APDU received"; + case Z_APDU_initRequest: + res = process_initRequest(assoc, req); break; + case Z_APDU_searchRequest: + res = process_searchRequest(assoc, req, &fd); break; + case Z_APDU_presentRequest: + res = process_presentRequest(assoc, req, &fd); break; + case Z_APDU_scanRequest: + if (assoc->bend_scan) + res = process_scanRequest(assoc, req, &fd); + else + { + *msg = "Cannot handle Scan APDU"; + return -1; + } + break; + case Z_APDU_extendedServicesRequest: + if (assoc->bend_esrequest) + res = process_ESRequest(assoc, req, &fd); + else + { + *msg = "Cannot handle Extended Services APDU"; return -1; + } + break; + case Z_APDU_sortRequest: + if (assoc->bend_sort) + res = process_sortRequest(assoc, req, &fd); + else + { + *msg = "Cannot handle Sort APDU"; + return -1; + } + break; + case Z_APDU_close: + process_close(assoc, req); + return 0; + case Z_APDU_deleteResultSetRequest: + if (assoc->bend_delete) + res = process_deleteRequest(assoc, req, &fd); + else + { + *msg = "Cannot handle Delete APDU"; + return -1; + } + break; + case Z_APDU_segmentRequest: + if (assoc->bend_segment) + { + res = process_segmentRequest (assoc, req); + } + else + { + *msg = "Cannot handle Segment APDU"; + return -1; + } + break; + default: + *msg = "Bad APDU received"; + return -1; } if (res) { @@ -850,6 +865,7 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb) binitreq.bend_esrequest = NULL; binitreq.bend_delete = NULL; binitreq.bend_scan = bend_default_scan; + binitreq.bend_segment = NULL; if (!(binitres = bend_init(&binitreq))) { yaz_log(LOG_WARN, "Bad response from backend."); @@ -869,6 +885,8 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb) yaz_log (LOG_DEBUG, "Delete handler installed"); if ((assoc->bend_scan = (int (*)())binitreq.bend_scan)) yaz_log (LOG_DEBUG, "Scan handler installed"); + if ((assoc->bend_segment = (int (*)())binitreq.bend_segment)) + yaz_log (LOG_DEBUG, "Segment handler installed"); resp->referenceId = req->referenceId; *options = '\0'; @@ -1874,6 +1892,22 @@ void *bend_request_getdata(bend_request r) return r->clientData; } +static Z_APDU *process_segmentRequest (association *assoc, request *reqb) +{ + bend_segment_rr request; + + request.segment = reqb->request->u.segmentRequest; + request.stream = assoc->encode; + request.decode = assoc->decode; + request.print = assoc->print; + request.association = assoc; + + ((int (*)(void *, bend_segment_rr *))(*assoc->bend_segment)) + (assoc->backend, &request); + + return 0; +} + static Z_APDU *process_ESRequest(association *assoc, request *reqb, int *fd) { bend_esrequest_rr esrequest; diff --git a/server/session.h b/server/session.h index 45146c6..183cd0e 100644 --- a/server/session.h +++ b/server/session.h @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: session.h,v $ - * Revision 1.21 1999-11-30 13:47:12 adam + * Revision 1.22 2000-03-20 19:06:25 adam + * Added Segment request for fronend server. Work on admin for client. + * + * Revision 1.21 1999/11/30 13:47:12 adam * Improved installation. Moved header files to include/yaz. * * Revision 1.20 1999/10/11 10:01:24 adam @@ -156,6 +159,7 @@ typedef struct association int (*bend_esrequest) (); int (*bend_delete) (); int (*bend_scan) (); + int (*bend_segment) (); } association; association *create_association(IOCHAN channel, COMSTACK link); diff --git a/server/statserv.c b/server/statserv.c index aab25b6..5717e78 100644 --- a/server/statserv.c +++ b/server/statserv.c @@ -7,7 +7,10 @@ * Chas Woodfield, Fretwell Downing Datasystems. * * $Log: statserv.c,v $ - * Revision 1.62 2000-03-17 12:47:02 adam + * Revision 1.63 2000-03-20 19:06:25 adam + * Added Segment request for fronend server. Work on admin for client. + * + * Revision 1.62 2000/03/17 12:47:02 adam * Minor changes to admin client. * * Revision 1.61 2000/03/15 12:59:49 adam @@ -880,9 +883,20 @@ int statserv_start(int argc, char **argv) inetd_connection(control_block.default_proto); else { +#if 0 + sigset_t sigs_to_block; + + sigemptyset(&sigs_to_block); + sigaddset (&sigs_to_block, SIGTERM); + pthread_sigmask (SIG_BLOCK, &sigs_to_block, 0); + pthread_create (& + + +#endif if (control_block.dynamic) signal(SIGCHLD, catchchld); } + signal (SIGTERM, sigterm); if (*control_block.setuid) { diff --git a/zutil/diagbib1.c b/zutil/diagbib1.c index 0822307..5ea35e8 100644 --- a/zutil/diagbib1.c +++ b/zutil/diagbib1.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: diagbib1.c,v $ - * Revision 1.3 2000-03-15 12:59:49 adam + * Revision 1.4 2000-03-20 19:06:25 adam + * Added Segment request for fronend server. Work on admin for client. + * + * Revision 1.3 2000/03/15 12:59:49 adam * Added handle member to statserv_control. * * Revision 1.2 1999/11/30 13:47:12 adam @@ -177,7 +180,7 @@ static struct { { 1016, "Init/AC: Blocked network address"}, { 1017, "Init/AC: No databases available for specified userId"}, { 1018, "Init/AC: System temporarily out of resources"}, -{ 1019, "Init/AC: System not available due to maintenance (Addinfo: when it's expected back up)" }, +{ 1019, "Init/AC: System not available due to maintenance" }, { 1020, "Init/AC: System temporarily unavailable (Addinfo: when it's expected back up)"}, { 1021, "Init/AC: Account has expired"}, { 1022, "Init/AC: Password has expired so a new one must be supplied"}, diff --git a/zutil/zget.c b/zutil/zget.c index ba4de8f..04f4f18 100644 --- a/zutil/zget.c +++ b/zutil/zget.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: zget.c,v $ - * Revision 1.2 1999-11-30 13:47:12 adam + * Revision 1.3 2000-03-20 19:06:25 adam + * Added Segment request for fronend server. Work on admin for client. + * + * Revision 1.2 1999/11/30 13:47:12 adam * Improved installation. Moved header files to include/yaz. * * Revision 1.1 1999/06/08 10:10:16 adam @@ -337,7 +340,7 @@ Z_Segment *zget_Segment(ODR o) r->numberOfRecordsReturned = (int *)odr_malloc(o, sizeof(int)); *r->numberOfRecordsReturned = 0; r->num_segmentRecords = 0; - r->segmentRecords = 0; + r->segmentRecords = odr_nullval(); r->otherInfo = 0; return r; } -- 1.7.10.4