]> andersk Git - moira.git/commitdiff
performance improvements
authormar <mar>
Mon, 21 Dec 1992 18:03:12 +0000 (18:03 +0000)
committermar <mar>
Mon, 21 Dec 1992 18:03:12 +0000 (18:03 +0000)
gen/aliases.dc
gen/nfs.dc

index e85cdfa43487990e0f81e32cdf6189fffe287e24..1326dc7a9dc5a6cf8521fb07f0a963d75aa954b1 100644 (file)
@@ -44,6 +44,7 @@ char **argv;
     initialize_sms_error_table();
 #ifsql INGRES
     EXEC SQL CONNECT moira;
+    EXEC SQL SET LOCKMODE SESSION WHERE LEVEL=TABLE, READLOCK=SHARED;
 #endsql
 #ifsql INFORMIX
     EXEC SQL DATABASE moira;
@@ -142,11 +143,12 @@ get_info()
     EXEC SQL SELECT modtime INTO :buf FROM users WHERE USERS_ID = 0;
 
     fprintf(stderr, "Loading machines\n");
-    machines = create_hash(1000);
+    machines = create_hash(10);
 
     EXEC SQL DECLARE m_cursor CURSOR FOR 
       SELECT mach_id, name 
-       FROM machine;
+      FROM machine
+      ORDER BY mach_id;
     EXEC SQL OPEN m_cursor;
     while (1) {
       EXEC SQL FETCH m_cursor INTO :id, :name;
@@ -162,16 +164,17 @@ get_info()
 
 
     fprintf(stderr, "Loading strings\n");
-    strings = create_hash(2000);
+    strings = create_hash(11001);
 
     EXEC SQL DECLARE s_cursor CURSOR FOR 
-      SELECT string_id, string 
-       FROM strings;
+      SELECT string_id, trim(string) 
+      FROM strings
+      ORDER BY string_id;
     EXEC SQL OPEN s_cursor;
     while (1) {
       EXEC SQL FETCH s_cursor INTO :id, :name;
       if (sqlca.sqlcode != 0) break;
-      hash_store(strings, id, strsave(strtrim(name)));
+      hash_store(strings, id, strsave(name));
     }
     EXEC SQL CLOSE s_cursor;
 
@@ -180,7 +183,8 @@ get_info()
 
     EXEC SQL DECLARE u_cursor CURSOR FOR
       SELECT users_id, login, potype, pop_id, box_id
-       FROM users WHERE status = 1 OR status = 5 OR status = 6;
+      FROM users 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 :id, :name, :type, :pid, :bid;
@@ -207,13 +211,15 @@ get_info()
        hash_store(users, id, u);
      }
     EXEC SQL CLOSE u_cursor;
+    EXEC SQL COMMIT;
 
     fprintf(stderr, "Loading lists\n");
     lists = create_hash(15001);
 
     EXEC SQL DECLARE l_cursor CURSOR FOR
       SELECT list_id, name, maillist, description, acl_type, acl_id
-       FROM list WHERE active != 0;
+      FROM list WHERE active != 0
+      ORDER BY list_id;
     EXEC SQL OPEN l_cursor;
     while (1) {
         EXEC SQL FETCH l_cursor INTO :id, :name, :maillistp,
@@ -229,12 +235,14 @@ get_info()
        hash_store(lists, id, l);
       }
     EXEC SQL CLOSE l_cursor;
+    EXEC SQL COMMIT;
 
     fprintf(stderr, "Loading members\n");
 
     EXEC SQL DECLARE mem_cursor CURSOR FOR
       SELECT list_id, member_type, member_id
-       FROM imembers WHERE direct = 1;
+      FROM imembers WHERE direct = 1
+      ORDER BY list_id;
     EXEC SQL OPEN mem_cursor;
     while (1) {
         EXEC SQL FETCH mem_cursor INTO :id, :type, :mid;
index d8b68a8eb0bdf8f25d7373b0c859b13972f1cca1..c7cb3af247d4c4d0b0a3cc1a76fd9960aa5bdff9 100644 (file)
@@ -22,6 +22,8 @@ EXEC SQL INCLUDE sqlca;
 char *whoami = "nfs.gen";
 char *malloc(), *strsave();
 char nfs_dir[64];
+struct hash *users, *groups;
+
 
 main(argc, argv)
 int argc;
@@ -40,10 +42,11 @@ char **argv;
     sprintf(nfs_dir, "%s/nfs", 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_nfs();
@@ -85,11 +88,15 @@ int do_nfs()
     machs = sq_create();
     lists = sq_create();
 
+    /* The following is declarative, not executed,
+     * and so is dependent on where it is in the file,
+     * not in the order of execution of statements.
+     */
     EXEC SQL WHENEVER SQLERROR GOTO sqlerr;
     EXEC SQL DECLARE s_cursor CURSOR FOR
       SELECT m.name, s.value3
       FROM machine m, serverhosts s
-      WHERE m.mach_id = s.mach_id AND s.service = "NFS" AND s.enable != 0;
+      WHERE m.mach_id = s.mach_id AND s.service = 'NFS' AND s.enable != 0;
     EXEC SQL OPEN s_cursor;
     while (1) {
         EXEC SQL FETCH s_cursor INTO :machname, :listname;
@@ -100,6 +107,7 @@ int do_nfs()
     EXEC SQL CLOSE s_cursor;
 
     changed = do_lists(lists);
+    EXEC SQL COMMIT;
     changed += do_machs(machs);
     return(changed);
  sqlerr:
@@ -117,7 +125,6 @@ int do_lists(lists)
 struct save_queue *lists;
 {
     char file[64], *u;
-    struct hash *users, *do_everyone();
     struct stat sb;
     FILE *fd;
     EXEC SQL BEGIN DECLARE SECTION;
@@ -126,6 +133,7 @@ struct save_queue *lists;
     EXEC SQL END DECLARE SECTION;
 
     sprintf(file, "%s/list-", nfs_dir);
+    /*
     if (stat(file, &sb) == 0) {
        if ((ModDiff (&flag1, "users", sb.st_mtime)) ||
            (ModDiff (&flag2, "list", sb.st_mtime)) ||
@@ -136,6 +144,7 @@ struct save_queue *lists;
            return(0);
        }
     }
+    */
 
     /* get locks */
     EXEC SQL SELECT modtime INTO :lname FROM list WHERE list_id = 0;
@@ -144,7 +153,7 @@ struct save_queue *lists;
     /* build the list of everyone, and store it in a file whose name
      * corresponds to the empty list.
      */
-    users = do_everyone();
+    do_everyone();
 
     fprintf(stderr, "Building specific lists\n");
     /* now do each of the lists used by an NFS server */
@@ -163,7 +172,8 @@ struct save_queue *lists;
          SELECT m.member_id
          FROM imembers m, list l
          WHERE m.list_id=l.list_id AND l.name = :listname AND
-           m.member_type="USER";
+           m.member_type='USER'
+         ORDER BY member_id;
        EXEC SQL OPEN m_cursor;
        while (1) {
            EXEC SQL FETCH m_cursor INTO :id;
@@ -201,10 +211,9 @@ struct user {
 };
 
 
-struct hash *do_everyone()
+do_everyone()
 {
     char buf[BUFSIZ], *l;
-    struct hash *groups, *users;
     struct user *u;
     struct grp *g;
     struct bucket *b, **p;
@@ -231,7 +240,8 @@ struct hash *do_everyone()
     EXEC SQL DECLARE l_cursor CURSOR FOR
      SELECT gid, list_id
      FROM list
-     WHERE grp <> 0 AND active != 0;
+     WHERE grouplist != 0 AND active != 0
+     ORDER BY list_id;
     EXEC SQL OPEN l_cursor;
     while (1) {
         EXEC SQL FETCH l_cursor INTO :gid, :lid;
@@ -246,7 +256,8 @@ struct hash *do_everyone()
     EXEC SQL DECLARE u_cursor CURSOR FOR
       SELECT users_id, login, uid
       FROM users
-      WHERE status = 1;
+      WHERE status = 1
+      ORDER BY users_id;
     EXEC SQL OPEN u_cursor;
     while (1) {
         EXEC SQL FETCH u_cursor INTO :id, :name, :uid;
@@ -262,7 +273,8 @@ struct hash *do_everyone()
     EXEC SQL DECLARE m_cursor2 CURSOR FOR
       SELECT list_id, member_id
       FROM imembers
-      WHERE member_type = "USER";
+      WHERE member_type = 'USER'
+      ORDER BY list_id;
     EXEC SQL OPEN m_cursor2;
     while (1) {
         EXEC SQL FETCH m_cursor2 INTO :lid, :id;
@@ -290,7 +302,7 @@ struct hash *do_everyone()
 
     fclose(fd);
     free(groups);
-    return(users);
+    return(1);
  sqlerr:
     com_err(whoami, MR_INGRES_ERR, " code %d\n", sqlca.sqlcode);
     critical_alert("DCM", "NFS build encountered DATABASE ERROR %d",
@@ -319,7 +331,7 @@ struct save_queue *machs;
 
     /* acquire locks on machines & filesystems */
     EXEC SQL SELECT modtime INTO :listname FROM users WHERE users_id = 0;
-    EXEC SQL SELECT modtime INTO :listname FROM machine WHERE users_id = 0;
+    EXEC SQL SELECT modtime INTO :listname FROM machine WHERE mach_id = 0;
     EXEC SQL SELECT modtime INTO :listname FROM filesys WHERE filsys_id = 0;
 
     machines = create_hash(100);
@@ -327,7 +339,8 @@ struct save_queue *machs;
        EXEC SQL SELECT s.value3, m.mach_id
          INTO :listname, :id
          FROM serverhosts s, machine m
-         WHERE s.mach_id = m.mach_id AND m.name = :machname;
+         WHERE s.mach_id = m.mach_id AND m.name = :machname AND 
+           s.service = 'NFS';
        strtrim(machname);
        sprintf(f1, "%s/list-%s", nfs_dir, strtrim(listname));
        sprintf(f2, "%s/%s.cred", nfs_dir, machname);
@@ -344,17 +357,22 @@ struct save_queue *machs;
     fd = stdin;
 
     EXEC SQL DECLARE q_cursor CURSOR FOR
-      SELECT DISTINCT q.quota, u.uid, q.phys_id, n.device, n.mach_id 
-      FROM quota q, users u, nfsphys n
-      WHERE u.users_id = q.entity_id AND n.nfsphys_id = q.phys_id AND
-           q.phys_id != 0 AND n.status < 16 AND q.type = "USER"
-      ORDER BY mach_id, phys_id, uid;
+      SELECT DISTINCT q.quota, q.entity_id, q.phys_id, n.device, n.mach_id 
+      FROM quota q, nfsphys n
+      WHERE n.nfsphys_id = q.phys_id AND q.phys_id != 0 AND
+       n.status < 16 AND q.type = 'USER'
+      ORDER BY n.mach_id, q.phys_id, q.entity_id;
     EXEC SQL OPEN q_cursor;
     while (1) {
        EXEC SQL FETCH q_cursor INTO :quota, :uid, :flag1, :dev, :flag2;
        if (sqlca.sqlcode != 0) break;
        if (flag1 != olddev || flag2 != oldmach) {
-           fclose(fd);
+           if (quotasum)
+             fprintf(fd, "%d %d\n", prevuid, quotasum);
+           if (flag2 == 0 || !hash_lookup(machines, flag2))
+             continue;
+           if (fd != stdin)
+             fclose(fd);
            olddev = flag1;
            oldmach = flag2;
            while (cp = index(dev, '/')) *cp = '@';
@@ -369,6 +387,9 @@ struct save_queue *machs;
            quotasum = 0;
        }
        if (uid != prevuid) {
+           if ((cp = hash_lookup(users, prevuid)) &&
+               (cp = index(cp, ':')))
+             prevuid = atoi(cp+1);
            if (quotasum)
              fprintf(fd, "%d %d\n", prevuid, quotasum);
            prevuid = uid;
@@ -378,6 +399,9 @@ struct save_queue *machs;
        }
     }
     EXEC SQL CLOSE q_cursor;
+    if ((cp = hash_lookup(users, prevuid)) &&
+       (cp = index(cp, ':')))
+      prevuid = atoi(cp+1);
     if (quotasum)
       fprintf(fd, "%d %d\n", prevuid, quotasum);
     if (fd != stdin && fclose(fd) == EOF) {
@@ -388,18 +412,24 @@ struct save_queue *machs;
     olddev = oldmach = -1;
     fd = stdin;
     EXEC SQL DECLARE q_cursor2 CURSOR FOR
-      SELECT DISTINCT q.quota, l.gid, q.phys_id, n.device, n.mach_id, n.status 
-      FROM quota q, list l, nfsphys n
-      WHERE l.list_id = q.entity_id AND n.nfsphys_id = q.phys_id AND
-           q.phys_id != 0 AND n.status > 15 AND q.type = "GROUP"
-      ORDER BY mach_id, phys_id, gid;
+      SELECT DISTINCT q.quota, q.entity_id, q.phys_id, n.device, n.mach_id,
+        n.status 
+      FROM quota q, nfsphys n
+      WHERE n.nfsphys_id = q.phys_id AND q.phys_id != 0 AND
+       n.status > 15 AND q.type = 'GROUP'
+      ORDER BY mach_id, phys_id, entity_id;
     EXEC SQL OPEN q_cursor2;
     while (1) {
        EXEC SQL FETCH q_cursor2 INTO :quota, :gid, :flag1, :dev,
                :flag2, :flag3;
        if (sqlca.sqlcode != 0) break;
        if (flag1 != olddev || flag2 != oldmach) {
-           fclose(fd);
+           if (quotasum)
+             fprintf(fd, "%d %d\n", prevuid, quotasum);
+           if (flag2 == 0 || !hash_lookup(machines, flag2))
+             continue;
+           if (fd != stdin)
+             fclose(fd);
            olddev = flag1;
            oldmach = flag2;
            while (cp = index(dev, '/')) *cp = '@';
@@ -414,6 +444,8 @@ struct save_queue *machs;
            quotasum = 0;
        }
        if (gid != prevuid) {
+           if (cp = hash_lookup(groups, prevuid))
+             prevuid = atoi(cp + 1);
            if (quotasum)
              fprintf(fd, "%d %d\n", prevuid, quotasum);
            prevuid = gid;
@@ -423,6 +455,8 @@ struct save_queue *machs;
        }
     }
     EXEC SQL CLOSE q_cursor2;
+    if (cp = hash_lookup(groups, prevuid))
+      prevuid = atoi(cp + 1);
     if (quotasum)
       fprintf(fd, "%d %d\n", prevuid, quotasum);
     if (fd != stdin && fclose(fd) == EOF) {
@@ -431,6 +465,7 @@ struct save_queue *machs;
       }
 
     olddev = oldmach = -1;
+    fd = stdin;
 
     EXEC SQL DECLARE q_cursor3 CURSOR FOR
       SELECT DISTINCT f.name, f.lockertype, u.uid, l.gid, f.phys_id, 
@@ -439,7 +474,7 @@ struct save_queue *machs;
       WHERE u.users_id = f.owner AND 
               l.list_id = f.owners AND
              f.createflg != 0 AND f.phys_id != 0 AND
-              f.type = "NFS" AND 
+              f.type = 'NFS' AND 
               f.phys_id = n.nfsphys_id
       ORDER BY mach_id, phys_id;
     EXEC SQL OPEN q_cursor3;
@@ -448,7 +483,8 @@ struct save_queue *machs;
                        :flag2, :dev;
        if (sqlca.sqlcode != 0) break;
        if (flag1 != olddev || flag2 != oldmach) {
-           fclose(fd);
+           if (fd != stdin)
+             fclose(fd);
            olddev = flag1;
            oldmach = flag2;
            while (cp = index(dev, '/')) *cp = '@';
This page took 0.077328 seconds and 5 git commands to generate.