source: trunk/third/moira/dbck/phase4.pc @ 24319

Revision 24319, 3.5 KB checked in by broder, 14 years ago (diff)
New Moira snapshot from SVN.
Line 
1/* $Id: phase4.pc 3956 2010-01-05 20:56:56Z zacheiss $
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
16EXEC SQL INCLUDE sqlca;
17
18RCSID("$HeadURL: svn+ssh://svn.mit.edu/moira/trunk/moira/dbck/phase4.pc $ $Id: phase4.pc 3956 2010-01-05 20:56:56Z zacheiss $");
19
20EXEC SQL WHENEVER SQLERROR DO dbmserr();
21
22void count_boxes(int id, void *user, void *boxes);
23void check_box_counts(int id, void *cnt, void *counts);
24void check_nfs_counts(int id, void *nfsphys, void *hint);
25
26void 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)(long) hash_lookup(boxes, u->pobox_id)))
34        {
35          if (hash_store(boxes, u->pobox_id, (void *)(long)(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
48void check_box_counts(int id, void *cnt, void *counts)
49{
50  EXEC SQL BEGIN DECLARE SECTION;
51  int oldval, rowcount, iid = id, icnt = (int)(long)cnt;
52  EXEC SQL END DECLARE SECTION;
53
54  oldval = (int)(long) 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
76void 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};
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          sprintf(valstr, "%lld", val);
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
107void 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 *)(long)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}
Note: See TracBrowser for help on using the repository browser.