]> andersk Git - moira.git/blobdiff - gen/hesiod.dc
Diane Delgado's changes for a fixed table-locking order
[moira.git] / gen / hesiod.dc
index 8e7c5f6162b36d5cd47c0a7108d95d460b6e2457..f83218b1b8cdcdcdf878e90cab527a526ce824ca 100644 (file)
@@ -26,6 +26,11 @@ EXEC SQL INCLUDE sqlca;
 #define HTYPE "TXT"
 #endif
 
+/* max number of bytes of a data record that can be returned in a hesiod 
+ * query.  This is 512 - overhead (~66) [derived empirically]
+ */
+#define MAXHESSIZE 446
+
 char hesiod_dir[64];
 
 #define min(x,y)       ((x) < (y) ? (x) : (y))
@@ -63,10 +68,11 @@ char **argv;
     sprintf(hesiod_dir, "%s/hesiod", DCM_DIR);
 
 #ifsql INGRES
-    EXEC SQL CONNECT sms;
+    EXEC SQL CONNECT moira;
+    EXEC SQL SET LOCKMODE SESSION WHERE LEVEL=TABLE, READLOCK=SHARED;
 #endsql
 #ifsql INFORMIX
-    EXEC SQL DATABASE sms;
+    EXEC SQL DATABASE moira;
 #endsql
 
     changed = do_passwd();
@@ -106,7 +112,7 @@ get_mach()
 {
     EXEC SQL BEGIN DECLARE SECTION;
     int id;
-    char name[33];
+    char name[41];
     EXEC SQL END DECLARE SECTION;
 
     if (machines)
@@ -114,22 +120,20 @@ get_mach()
 
     machines = create_hash(1000);
     EXEC SQL DECLARE m_cursor CURSOR FOR
-      SELECT NAME, MACH_ID
-       FROM MACHINE;
+      SELECT name, mach_id
+      FROM machine
+      WHERE status = 1 and mach_id != 0
+      ORDER BY mach_id;
     EXEC SQL OPEN m_cursor;
     while (1) {
         EXEC SQL FETCH m_cursor INTO :name, :id;
         if (sqlca.sqlcode != 0) break;
        hash_store(machines, id, strsave(strtrim(name)));
     }
-    if (sqlca.sqlcode < 0) {
-       com_err(whoami, MR_INGRES_ERR, " code %d\n", sqlca.sqlcode);
-       critical_alert("DCM", "Hesiod build encountered DATABASE ERROR %d",
-                      sqlca.sqlcode);
-       exit(MR_INGRES_ERR);
-    }
+    if (sqlca.sqlcode < 0) db_error(sqlca.sqlcode);
     EXEC SQL CLOSE m_cursor;
 #ifsql INGRES
+    EXEC SQL COMMIT;
 #endsql
 #ifsql INFORMIX
     EXEC SQL COMMIT WORK;
@@ -194,7 +198,8 @@ do_passwd()
       SELECT login, uid, shell, fullname, nickname, office_addr,
             office_phone, home_phone, users_id, pop_id, potype, status
       FROM users
-      WHERE status = 1 or status = 6;
+      WHERE status = 1 or status = 5 or status = 6
+      ORDER BY users_id;
     EXEC SQL OPEN u_cursor;
     while (1) {
         EXEC SQL FETCH u_cursor INTO :login, :uid, :shell, :fullname, :nn,
@@ -217,19 +222,15 @@ do_passwd()
                        login, shell);
                fprintf(uout, "%d.uid\tHS CNAME %s.passwd\n", uid, login);
            }
-           if (ptype[0] == 'P' && (mach = hash_lookup(machines, pid))) {
+           if (pid != 0 && (mach = hash_lookup(machines, pid))) {
                fprintf(bout, "%s.pobox\tHS %s \"POP %s %s\"\n",
                        login, HTYPE, mach, login);
            }
     }
-    if (sqlca.sqlcode < 0) {
-       com_err(whoami, MR_INGRES_ERR, " code %d\n", sqlca.sqlcode);
-       critical_alert("DCM", "Hesiod build encountered DATABASE ERROR %d",
-                      sqlca.sqlcode);
-       exit(MR_INGRES_ERR);
-    }
+    if (sqlca.sqlcode < 0) db_error(sqlca.sqlcode);
     EXEC SQL CLOSE u_cursor;
 #ifsql INGRES
+    EXEC SQL COMMIT;
 #endsql
 #ifsql INFORMIX
     EXEC SQL COMMIT WORK;
@@ -258,7 +259,7 @@ do_groups()
     time_t ftime;
     EXEC SQL BEGIN DECLARE SECTION;
     char name[33];
-    int gid, id, lid, flag1, flag2, flag3;
+    int gid, id, lid, flag1, flag2, flag3, len;
     EXEC SQL END DECLARE SECTION;
 
     /* open files */
@@ -302,16 +303,22 @@ do_groups()
     /* make space for group list */
     groups = create_hash(15001);
 
+    /* The following WHENEVER is declarative, not executed,
+     * and applies for the remainder of this file only.
+     */
     EXEC SQL WHENEVER SQLERROR GOTO sqlerr;
 
     /* get lock records */
-    EXEC SQL SELECT modtime INTO :name FROM list WHERE list_id = 0;
+    EXEC SQL SELECT modtime INTO :name FROM imembers WHERE list_id = 0;
     EXEC SQL SELECT modtime INTO :name FROM users WHERE users_id = 0;
+    EXEC SQL SELECT modtime INTO :name FROM list WHERE list_id = 0;
+
 
     EXEC SQL DECLARE l_cursor CURSOR FOR
       SELECT name, gid, list_id
-       FROM list
-         WHERE grp != 0 AND active != 0;
+      FROM list
+      WHERE grouplist != 0 AND active != 0
+      ORDER BY list_id;
     EXEC SQL OPEN l_cursor;
     while (1) {
        EXEC SQL FETCH l_cursor INTO :name, :gid, :lid;
@@ -333,8 +340,9 @@ do_groups()
        users = create_hash(12001);
        EXEC SQL DECLARE u_cursor2 CURSOR FOR
          SELECT users_id, login
-           FROM users
-             WHERE status = 1;
+         FROM users
+         WHERE status = 1
+         ORDER BY users_id;
        EXEC SQL OPEN u_cursor2;
         while (1) {
            EXEC SQL FETCH u_cursor2 INTO :id, :name;
@@ -349,8 +357,9 @@ do_groups()
 
     EXEC SQL DECLARE i_cursor CURSOR FOR
       SELECT list_id, member_id
-       FROM imembers
-         WHERE member_type = "USER";
+      FROM imembers
+      WHERE member_type = 'USER'
+      ORDER BY list_id;
     EXEC SQL OPEN i_cursor;
     while (1) {
        EXEC SQL FETCH i_cursor INTO :lid, :id;
@@ -365,6 +374,7 @@ do_groups()
     }
     EXEC SQL CLOSE i_cursor;
 #ifsql INGRES
+    EXEC SQL COMMIT;
 #endsql
 #ifsql INFORMIX
     EXEC SQL COMMIT WORK;
@@ -376,10 +386,18 @@ do_groups()
              continue;
            fprintf(lout, "%s.grplist\tHS %s \"",
                    ((struct user *)b->data)->name, HTYPE);
+           len = 0;
            for (; g; g = g->next) {
-               fputs(g->lid, lout);
-               if (g->next)
-                 putc(':', lout);
+               if (len + strlen(g->lid) + 1 < MAXHESSIZE) {
+                   fputs(g->lid, lout);
+                   if (g->next)
+                     putc(':', lout);
+                   len += strlen(g->lid) + 1;
+               } else {
+                   com_err(whoami, 0, "truncated grp list for user %s",
+                           ((struct user *)b->data)->name);
+                   break;
+               }
            }
            fputs("\"\n", lout);
        }
@@ -394,10 +412,8 @@ do_groups()
     fix_file(loutf);
     return(1);
  sqlerr:
-    com_err(whoami, MR_INGRES_ERR, " code %d\n", sqlca.sqlcode);
-    critical_alert("DCM", "Hesiod build encountered DATABASE ERROR %d",
-                  sqlca.sqlcode);
-    exit(MR_INGRES_ERR);
+    db_error(sqlca.sqlcode);
+    return(0);
 }
 
 
@@ -408,7 +424,7 @@ do_filsys()
     register char *p;
     struct stat sb;
     time_t ftime;
-    struct save_queue *sq, *sq_create();
+    struct save_queue *sq, *sq2, *sq_create();
     EXEC SQL BEGIN DECLARE SECTION;
     char name[33], type[9], loc[81], access[2], mount[33], trans[257];
     char comments[65];
@@ -442,10 +458,17 @@ do_filsys()
     fprintf(stderr, "Building filsys.db\n");
     get_mach();
     sq = sq_create();
+    sq2 = sq_create();
+
+    /* get lock records */
+
+    EXEC SQL SELECT modtime INTO :name from filesys where filsys_id = 0;
+    EXEC SQL SELECT modtime INTO :name from fsgroup where filsys_id = 0;
 
     EXEC SQL DECLARE f_cursor CURSOR FOR
       SELECT label, type, name, mach_id, access, mount, comments, filsys_id
-       FROM filesys;
+      FROM filesys
+      ORDER BY filsys_id;
     EXEC SQL OPEN f_cursor;
     while (1) {
        EXEC SQL FETCH f_cursor INTO :name, :type, :loc, :id, :access, 
@@ -468,6 +491,9 @@ do_filsys()
        } else if (!strcmp(type, "FSGROUP")) {
            sprintf(trans, "%s:%d", strtrim(name), fid);
            sq_save_data(sq, strsave(trans));
+       } else if (!strcmp(type, "MUL")) {
+           sprintf(trans, "%s:%d", strtrim(name), fid);
+           sq_save_data(sq2, strsave(trans));
        }
     }
     EXEC SQL CLOSE f_cursor;
@@ -480,8 +506,8 @@ do_filsys()
          SELECT DISTINCT f.type, f.name, f.mach_id, f.access, f.mount,
                f.comments, f.label, g.key
          FROM filesys f, fsgroup g
-           WHERE f.filsys_id = g.filsys_id AND g.group_id = :fid
-           ORDER BY key, label;
+         WHERE f.filsys_id = g.filsys_id AND g.group_id = :fid
+         ORDER BY key, label;
        EXEC SQL OPEN f_cursor2;
         while (1) {
             EXEC SQL FETCH f_cursor2 INTO :type, :loc, :id, :access,:mount,
@@ -508,10 +534,31 @@ do_filsys()
     }
     sq_destroy(sq);
 
+    while (sq_get_data(sq2, &group)) {
+        fid = atoi(index(group, ':') + 1);
+        *index(group, ':') = 0;
+        fprintf(out, "%s.filsys\tHS %s \"MUL", group, HTYPE);
+       EXEC SQL DECLARE f_cursor3 CURSOR FOR
+           SELECT DISTINCT f.label, g.key
+           FROM filesys f, fsgroup g
+           WHERE f.filsys_id = g.filsys_id AND g.group_id = :fid
+           ORDER BY key, label;
+       EXEC SQL OPEN f_cursor3;
+       while (1) {
+           EXEC SQL FETCH f_cursor3 INTO :name, :trans;
+           if (sqlca.sqlcode != 0) break;
+            fprintf(out, " %s", strtrim(name));
+       }
+       EXEC SQL CLOSE f_cursor3;
+        fprintf(out, "\"\n");
+        free(group);
+    }
+    sq_destroy(sq2);
+
     EXEC SQL DECLARE a_cursor CURSOR FOR
       SELECT name, trans
-       FROM alias
-         WHERE type = "FILESYS";
+      FROM alias
+      WHERE type = 'FILESYS';
     EXEC SQL OPEN a_cursor;
     while (1) {
         EXEC SQL FETCH a_cursor INTO :name, :trans;
@@ -521,6 +568,7 @@ do_filsys()
     }
     EXEC SQL CLOSE a_cursor;
 #ifsql INGRES
+    EXEC SQL COMMIT;
 #endsql
 #ifsql INFORMIX
     EXEC SQL COMMIT WORK;
@@ -533,10 +581,8 @@ do_filsys()
     fix_file(outf);
     return(1);
  sqlerr:
-    com_err(whoami, MR_INGRES_ERR, " code %d\n", sqlca.sqlcode);
-    critical_alert("DCM", "Hesiod build encountered DATABASE ERROR %d",
-                  sqlca.sqlcode);
-    exit(MR_INGRES_ERR);
+    db_error(sqlca.sqlcode);
+    return(0);
 }
 
 
@@ -573,12 +619,12 @@ set_mask *set;
 do_cluster()
 {
     FILE *out;
-    char outf[64], outft[64], *mach, machbuf[33], *p;
+    char outf[64], outft[64], *mach, machbuf[41], *p;
     struct stat sb;
     time_t ftime;
     EXEC SQL BEGIN DECLARE SECTION;
     int flag1, flag2, flag3, flag4, maxmach, maxclu, mid, cid, id;
-    char name[33], label2[17], data[33];
+    char name[41], label2[17], data[33];
     EXEC SQL END DECLARE SECTION;
     set_mask **machs, *ms, *ps;
     int oneclu;
@@ -607,6 +653,12 @@ do_cluster()
     fprintf(stderr, "Building cluster.db\n");
     get_mach();
 
+    /* get lock records */
+    EXEC SQL SELECT modtime INTO :name  FROM machine where mach_id = 0;
+    EXEC SQL SELECT modtime INTO :name  FROM cluster where clu_id = 0;
+    EXEC SQL SELECT modtime INTO :name  FROM mcmap where mach_id = 0;
+    EXEC SQL SELECT modtime INTO :name  FROM svc where clu_id = 0;
+
     EXEC SQL SELECT MAX(clu_id) INTO :maxclu FROM cluster;
     maxclu++;
     setsize = howmany(maxclu, NSETBITS);
@@ -618,7 +670,8 @@ do_cluster()
 
     EXEC SQL DECLARE p_cursor CURSOR FOR
       SELECT mach_id, clu_id
-       FROM mcmap;
+      FROM mcmap
+      ORDER BY mach_id;
     EXEC SQL OPEN p_cursor;
     while (1) {
         EXEC SQL FETCH p_cursor INTO :mid, :cid;
@@ -714,6 +767,7 @@ do_cluster()
     }
     free(machs);
 #ifsql INGRES
+    EXEC SQL COMMIT;
 #endsql
 #ifsql INFORMIX
     EXEC SQL COMMIT WORK;
@@ -726,10 +780,8 @@ do_cluster()
     fix_file(outf);
     return(1);
  sqlerr:
-    com_err(whoami, MR_INGRES_ERR, " code %d\n", sqlca.sqlcode);
-    critical_alert("DCM", "Hesiod build encountered DATABASE ERROR %d",
-                  sqlca.sqlcode);
-    exit(MR_INGRES_ERR);
+    db_error(sqlca.sqlcode);
+    return(0);
 }
 
 
@@ -741,15 +793,17 @@ do_printcap()
     time_t ftime;
     EXEC SQL BEGIN DECLARE SECTION;
     char name[17], rp[17], sd[33];
-    int flag, ka, pc, rm, rq;
+    int flag1, flag2, ka, pc, rm, rq;
     EXEC SQL END DECLARE SECTION;
 
     sprintf(outf, "%s/printcap.db", hesiod_dir);
 
     if (stat(outf, &sb) == 0) {
        ftime = sb.st_mtime;
-       if (ModDiff (&flag, "printcap", ftime)) exit (MR_DATE);
-       if (flag < 0) {
+       if (ModDiff (&flag1, "printcap", ftime)
+           || ModDiff (&flag2, "machine", ftime))
+         exit (MR_DATE);
+       if (flag1 < 0 && flag2 < 0) {
            fprintf(stderr, "File printcap.db does not need to be rebuilt.\n");
            return(0);
       }
@@ -784,6 +838,7 @@ do_printcap()
     }
     EXEC SQL CLOSE p_cursor2;
 #ifsql INGRES
+    EXEC SQL COMMIT;
 #endsql
 #ifsql INFORMIX
     EXEC SQL COMMIT WORK;
@@ -796,10 +851,8 @@ do_printcap()
     fix_file(outf);
     return(1);
  sqlerr:
-    com_err(whoami, MR_INGRES_ERR, " code %d\n", sqlca.sqlcode);
-    critical_alert("DCM", "Hesiod build encountered DATABASE ERROR %d",
-                  sqlca.sqlcode);
-    exit(MR_INGRES_ERR);
+    db_error(sqlca.sqlcode);
+    return(0);
   }
 
 
@@ -853,7 +906,7 @@ do_palladium()
     EXEC SQL DECLARE a_cursor2 CURSOR FOR
       SELECT name, trans
       FROM alias
-      WHERE type = "PALLADIUM";
+      WHERE type = 'PALLADIUM';
     EXEC SQL OPEN a_cursor2; 
     while (1) { 
         EXEC SQL FETCH a_cursor2 INTO :name, :trans;
@@ -864,6 +917,7 @@ do_palladium()
     }
     EXEC SQL CLOSE a_cursor2;
 #ifsql INGRES
+    EXEC SQL COMMIT;
 #endsql
 #ifsql INFORMIX
     EXEC SQL COMMIT WORK;
@@ -876,10 +930,8 @@ do_palladium()
     fix_file(outf);
     return(1);
  sqlerr:
-    com_err(whoami, MR_INGRES_ERR, " code %d\n", sqlca.sqlcode);
-    critical_alert("DCM", "Hesiod build encountered DATABASE ERROR %d",
-                  sqlca.sqlcode);
-    exit(MR_INGRES_ERR);
+    db_error(sqlca.sqlcode);
+    return(0);
 }
 
 
@@ -930,6 +982,7 @@ do_sloc()
     }
     EXEC SQL CLOSE s_cursor;
 #ifsql INGRES
+    EXEC SQL COMMIT;
 #endsql
 #ifsql INFORMIX
     EXEC SQL COMMIT WORK;
@@ -943,10 +996,8 @@ do_sloc()
     fix_file(outf);
     return(1);
  sqlerr:
-    com_err(whoami, MR_INGRES_ERR, " code %d\n", sqlca.sqlcode);
-    critical_alert("DCM", "Hesiod build encountered DATABASE ERROR %d",
-                  sqlca.sqlcode);
-    exit(MR_INGRES_ERR);
+    db_error(sqlca.sqlcode);
+    return(0);
 }
 
 do_service()
@@ -998,7 +1049,7 @@ do_service()
     EXEC SQL DECLARE a_cursor3 CURSOR FOR
       SELECT name, trans
       FROM alias
-      WHERE type = "SERVICE";
+      WHERE type = 'SERVICE';
     EXEC SQL OPEN a_cursor3; 
     while (1) { 
         EXEC SQL FETCH a_cursor3 INTO :service, :altserv;
@@ -1009,6 +1060,7 @@ do_service()
     }
     EXEC SQL CLOSE a_cursor3;
 #ifsql INGRES
+    EXEC SQL COMMIT;
 #endsql
 #ifsql INFORMIX
     EXEC SQL COMMIT WORK;
@@ -1021,8 +1073,13 @@ do_service()
     fix_file(outf);
     return(1);
  sqlerr:
-    com_err(whoami, MR_INGRES_ERR, " code %d\n", sqlca.sqlcode);
-    critical_alert("DCM", "Hesiod build encountered DATABASE ERROR %d",
-                  sqlca.sqlcode);
-    exit(MR_INGRES_ERR);
+    db_error(sqlca.sqlcode);
+    return(0);
 }
+
+
+
+
+
+
+
This page took 0.057168 seconds and 4 git commands to generate.