3 * (c) Copyright 1988-1998 by the Massachusetts Institute of Technology.
4 * For copying and distribution information, please see the file
8 #include <mit-copyright.h>
16 EXEC SQL INCLUDE sqlca;
20 EXEC SQL WHENEVER SQLERROR DO dbmserr();
22 void count_boxes(int id, void *user, void *boxes);
23 void check_box_counts(int id, void *cnt, void *counts);
24 void check_nfs_counts(int id, void *nfsphys, void *hint);
26 void count_boxes(int id, void *user, void *boxes)
28 struct user *u = user;
33 if ((i = (int) hash_lookup(boxes, u->pobox_id)))
35 if (hash_store(boxes, u->pobox_id, (void *)(i + 1)) == -1)
36 out_of_mem("storing poboxes in hash table");
40 printf("User %s(%s) has pobox on non-POP server %d\n",
41 u->fullname, u->login, u->pobox_id);
42 printf("Not fixing this error\n");
48 void check_box_counts(int id, void *cnt, void *counts)
50 EXEC SQL BEGIN DECLARE SECTION;
51 int oldval, rowcount, iid = id, icnt = (int)cnt;
52 EXEC SQL END DECLARE SECTION;
54 oldval = (int) hash_lookup(counts, id);
58 printf("Count wrong on POBox machine %s; is %d in db, counted %d\n",
59 ((struct machine *) hash_lookup(machines, id))->name,
61 if (single_fix("Update", 1))
63 EXEC SQL UPDATE serverhosts SET value1 = :icnt
64 WHERE service = 'POP' AND mach_id = :iid;
65 rowcount = sqlca.sqlerrd[2];
67 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
69 printf("Not fixed\n");
70 modified("serverhosts");
76 void check_nfs_counts(int id, void *nfsphys, void *hint)
78 struct nfsphys *n = nfsphys;
79 EXEC SQL BEGIN DECLARE SECTION;
80 int iid = id, val, rowcount;
81 EXEC SQL END DECLARE SECTION;
84 if (n->allocated != val)
86 printf("Count wrong on NFSphys %s:%s; is %d in db, counted %d\n",
87 ((struct machine *) hash_lookup(machines, n->mach_id))->name,
88 n->dir, n->allocated, val);
89 if (single_fix("Update", 1))
91 EXEC SQL UPDATE nfsphys SET allocated = :val
92 WHERE nfsphys_id = :iid;
93 rowcount = sqlca.sqlerrd[2];
95 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
97 printf("Not fixed\n");
106 struct hash *boxes, *counts;
109 printf("Phase 4 - Checking counts\n");
111 dprintf("Doing POBoxes...\n");
112 boxes = create_hash(10);
113 counts = create_hash(10);
114 EXEC SQL DECLARE csr401 CURSOR FOR
115 SELECT mach_id, value1 FROM serverhosts
116 WHERE service = 'POP';
117 EXEC SQL OPEN csr401;
120 EXEC SQL FETCH csr401 INTO :id, :cnt;
124 if (hash_store(boxes, id, (void *)1) == -1)
125 out_of_mem("storing poboxes");
126 if (hash_store(counts, id, (void *)cnt) == -1)
127 out_of_mem("storing pobox counts in hash table");
129 EXEC SQL CLOSE csr401;
130 hash_step(users, count_boxes, boxes);
131 hash_step(boxes, check_box_counts, counts);
133 dprintf("Doing NFSphys...\n");
134 hash_step(nfsphys, check_nfs_counts, 0);