]>
Commit | Line | Data |
---|---|---|
7ac48069 | 1 | /* $Id$ |
68bbc9c3 | 2 | * |
7ac48069 | 3 | * (c) Copyright 1988-1998 by the Massachusetts Institute of Technology. |
4 | * For copying and distribution information, please see the file | |
5 | * <mit-copyright.h>. | |
68bbc9c3 | 6 | */ |
7 | ||
8 | #include <mit-copyright.h> | |
9 | #include <moira.h> | |
10 | #include "dbck.h" | |
7ac48069 | 11 | |
12 | #include <stdio.h> | |
13 | #include <stdlib.h> | |
14 | #include <string.h> | |
15 | ||
208a4f4a | 16 | EXEC SQL INCLUDE sqlca; |
68bbc9c3 | 17 | |
7ac48069 | 18 | RCSID("$Header$"); |
68bbc9c3 | 19 | |
4b9e5c72 | 20 | EXEC SQL WHENEVER SQLERROR DO dbmserr(); |
68bbc9c3 | 21 | |
7ac48069 | 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); | |
25 | ||
26 | void count_boxes(int id, void *user, void *boxes) | |
68bbc9c3 | 27 | { |
7ac48069 | 28 | struct user *u = user; |
5eaef520 | 29 | int i; |
68bbc9c3 | 30 | |
5eaef520 | 31 | if (u->potype == 'P') |
32 | { | |
33 | if ((i = (int) hash_lookup(boxes, u->pobox_id))) | |
34 | { | |
7ac48069 | 35 | if (hash_store(boxes, u->pobox_id, (void *)(i + 1)) == -1) |
ab05f33a | 36 | out_of_mem("storing poboxes in hash table"); |
5eaef520 | 37 | } |
38 | else | |
39 | { | |
68bbc9c3 | 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"); | |
5eaef520 | 43 | } |
68bbc9c3 | 44 | } |
45 | } | |
46 | ||
47 | ||
7ac48069 | 48 | void check_box_counts(int id, void *cnt, void *counts) |
208a4f4a | 49 | { |
5eaef520 | 50 | EXEC SQL BEGIN DECLARE SECTION; |
7ac48069 | 51 | int oldval, rowcount, iid = id, icnt = (int)cnt; |
5eaef520 | 52 | EXEC SQL END DECLARE SECTION; |
53 | ||
54 | oldval = (int) hash_lookup(counts, id); | |
7ac48069 | 55 | icnt--; |
56 | if (oldval != icnt) | |
5eaef520 | 57 | { |
58 | printf("Count wrong on POBox machine %s; is %d in db, counted %d\n", | |
59 | ((struct machine *) hash_lookup(machines, id))->name, | |
7ac48069 | 60 | oldval, icnt); |
5eaef520 | 61 | if (single_fix("Update", 1)) |
62 | { | |
63 | EXEC SQL UPDATE serverhosts SET value1 = :icnt | |
64 | WHERE service = 'POP' AND mach_id = :iid; | |
65 | rowcount = sqlca.sqlerrd[2]; | |
66 | if (rowcount > 0) | |
67 | printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies"); | |
68 | else | |
69 | printf("Not fixed\n"); | |
70 | modified("serverhosts"); | |
68bbc9c3 | 71 | } |
72 | } | |
208a4f4a | 73 | } |
68bbc9c3 | 74 | |
75 | ||
7ac48069 | 76 | void check_nfs_counts(int id, void *nfsphys, void *hint) |
208a4f4a | 77 | { |
7ac48069 | 78 | struct nfsphys *n = nfsphys; |
5eaef520 | 79 | EXEC SQL BEGIN DECLARE SECTION; |
80 | int iid = id, val, rowcount; | |
81 | EXEC SQL END DECLARE SECTION; | |
82 | ||
83 | val = n->count; | |
84 | if (n->allocated != val) | |
85 | { | |
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)) | |
90 | { | |
91 | EXEC SQL UPDATE nfsphys SET allocated = :val | |
92 | WHERE nfsphys_id = :iid; | |
93 | rowcount = sqlca.sqlerrd[2]; | |
94 | if (rowcount > 0) | |
95 | printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies"); | |
96 | else | |
97 | printf("Not fixed\n"); | |
98 | modified("nfsphys"); | |
68bbc9c3 | 99 | } |
100 | } | |
208a4f4a | 101 | } |
68bbc9c3 | 102 | |
103 | ||
7ac48069 | 104 | void phase4(void) |
208a4f4a | 105 | { |
5eaef520 | 106 | struct hash *boxes, *counts; |
107 | int id, cnt; | |
108 | ||
109 | printf("Phase 4 - Checking counts\n"); | |
110 | ||
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; | |
118 | while (1) | |
119 | { | |
120 | EXEC SQL FETCH csr401 INTO :id, :cnt; | |
121 | if (sqlca.sqlcode) | |
122 | break; | |
123 | ||
7ac48069 | 124 | if (hash_store(boxes, id, (void *)1) == -1) |
5eaef520 | 125 | out_of_mem("storing poboxes"); |
7ac48069 | 126 | if (hash_store(counts, id, (void *)cnt) == -1) |
5eaef520 | 127 | out_of_mem("storing pobox counts in hash table"); |
208a4f4a | 128 | } |
5eaef520 | 129 | EXEC SQL CLOSE csr401; |
130 | hash_step(users, count_boxes, boxes); | |
131 | hash_step(boxes, check_box_counts, counts); | |
68bbc9c3 | 132 | |
5eaef520 | 133 | dprintf("Doing NFSphys...\n"); |
134 | hash_step(nfsphys, check_nfs_counts, 0); | |
208a4f4a | 135 | } |