/*
* $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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
-
+#include <assert.h>
+#include <dirent.h>
+#include <fnmatch.h>
+#include <sys/stat.h>
#include <yaz/yaz-util.h>
#include <yaz/tcpip.h>
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;
}
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];
* 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
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;
}
}
wait = 0;
+ if (conn
#ifdef USE_SELECT
- if (conn && FD_ISSET(cs_fileno(conn), &input))
+ && FD_ISSET(cs_fileno(conn), &input)
#endif
+ )
{
do
{
* 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
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;
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
* 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
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 */
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)
{
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.");
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';
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;
* 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
int (*bend_esrequest) ();
int (*bend_delete) ();
int (*bend_scan) ();
+ int (*bend_segment) ();
} association;
association *create_association(IOCHAN channel, COMSTACK link);
* 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
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)
{
* 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
{ 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"},
* 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
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;
}