]> andersk Git - moira.git/blob - dbck/phase4.pc
Command line printer manipulation client, and build goo.
[moira.git] / dbck / phase4.pc
1 /* $Id$
2  *
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>.
6  */
7
8 #include <mit-copyright.h>
9 #include <moira.h>
10 #include "dbck.h"
11
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <string.h>
15
16 EXEC SQL INCLUDE sqlca;
17
18 RCSID("$Header$");
19
20 EXEC SQL WHENEVER SQLERROR DO dbmserr();
21
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)
27 {
28   struct user *u = user;
29   int i;
30
31   if (u->potype == 'P')
32     {
33       if ((i = (int) hash_lookup(boxes, u->pobox_id)))
34         {
35           if (hash_store(boxes, u->pobox_id, (void *)(i + 1)) == -1)
36             out_of_mem("storing poboxes in hash table");
37         }
38       else
39         {
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");
43         }
44     }
45 }
46
47
48 void check_box_counts(int id, void *cnt, void *counts)
49 {
50   EXEC SQL BEGIN DECLARE SECTION;
51   int oldval, rowcount, iid = id, icnt = (int)cnt;
52   EXEC SQL END DECLARE SECTION;
53
54   oldval = (int) hash_lookup(counts, id);
55   icnt--;
56   if (oldval != icnt)
57     {
58       printf("Count wrong on POBox machine %s; is %d in db, counted %d\n",
59              ((struct machine *) hash_lookup(machines, id))->name,
60              oldval, icnt);
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");
71         }
72     }
73 }
74
75
76 void check_nfs_counts(int id, void *nfsphys, void *hint)
77 {
78   struct nfsphys *n = nfsphys;
79   EXEC SQL BEGIN DECLARE SECTION;
80   int iid = id, rowcount;
81   unsigned long long val;
82   char valstr[40] = {0}, *endptr = valstr+39;
83   EXEC SQL END DECLARE SECTION;
84
85   val = n->count;
86   if (n->allocated != val)
87     {
88       printf("Count wrong on NFSphys %s:%s; is %lld in db, counted %lld\n",
89              ((struct machine *) hash_lookup(machines, n->mach_id))->name,
90              n->dir, n->allocated, val);
91       if (single_fix("Update", 1))
92         {
93           strcpy(valstr, ulltostr(val, endptr));
94           EXEC SQL UPDATE nfsphys SET allocated = TO_NUMBER(:valstr)
95             WHERE nfsphys_id = :iid;
96           rowcount = sqlca.sqlerrd[2];
97           if (rowcount > 0)
98             printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
99           else
100             printf("Not fixed\n");
101           modified("nfsphys");
102         }
103     }
104 }
105
106
107 void phase4(void)
108 {
109   struct hash *boxes, *counts;
110   int id, cnt;
111
112   printf("Phase 4 - Checking counts\n");
113
114   dprintf("Doing POBoxes...\n");
115   boxes = create_hash(10);
116   counts = create_hash(10);
117   EXEC SQL DECLARE csr401 CURSOR FOR
118     SELECT mach_id, value1 FROM serverhosts
119     WHERE service = 'POP';
120   EXEC SQL OPEN csr401;
121   while (1)
122     {
123       EXEC SQL FETCH csr401 INTO :id, :cnt;
124       if (sqlca.sqlcode)
125         break;
126
127       if (hash_store(boxes, id, (void *)1) == -1)
128         out_of_mem("storing poboxes");
129       if (hash_store(counts, id, (void *)cnt) == -1)
130         out_of_mem("storing pobox counts in hash table");
131     }
132   EXEC SQL CLOSE csr401;
133   hash_step(users, count_boxes, boxes);
134   hash_step(boxes, check_box_counts, counts);
135
136   dprintf("Doing NFSphys...\n");
137   hash_step(nfsphys, check_nfs_counts, 0);
138 }
This page took 1.904144 seconds and 5 git commands to generate.