Added Segment request for fronend server. Work on admin for client.
authorAdam Dickmeiss <adam@indexdata.dk>
Mon, 20 Mar 2000 19:06:25 +0000 (19:06 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Mon, 20 Mar 2000 19:06:25 +0000 (19:06 +0000)
client/admin.c
client/client.c
include/yaz/backend.h
server/seshigh.c
server/session.h
server/statserv.c
zutil/diagbib1.c
zutil/zget.c

index 7f9fca7..a2873fa 100644 (file)
@@ -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
 #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>
@@ -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];
index f9350b8..2dae9b3 100644 (file)
@@ -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
             {
index 214f3e6..1a9a21e 100644 (file)
  * 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
index ee0f7f2..92ff44a 100644 (file)
@@ -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;
index 45146c6..183cd0e 100644 (file)
@@ -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);
index aab25b6..5717e78 100644 (file)
@@ -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)
     {
index 0822307..5ea35e8 100644 (file)
@@ -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"},
index ba4de8f..04f4f18 100644 (file)
@@ -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;
 }