]> andersk Git - moira.git/blame - dbck/dbck.dc
dbck fixes by kcr, dkk, and myself from the end of the summer.
[moira.git] / dbck / dbck.dc
CommitLineData
68bbc9c3 1/* $Header$
2 *
3 * Moira database consistency checker
4 *
5 * (c) Copyright 1988 by the Massachusetts Institute of Technology.
6 * For copying and distribution information, please see the file
7 * <mit-copyright.h>.
8 */
9
10#include <mit-copyright.h>
11#include <stdio.h>
12#include <strings.h>
13#include <signal.h>
14#include "dbck.h"
ab05f33a 15EXEC SQL INCLUDE sqlca;
68bbc9c3 16
17
18static char dbck_qc_rcsid[] = "$Header$";
19
20
21int debug = 0;
22int mode = MODE_ASK;
23int fast = 0;
24int warn = 1;
208a4f4a 25int abort_p = 0;
68bbc9c3 26struct hash *users, *machines, *clusters, *lists, *filesys, *nfsphys;
ab05f33a 27struct hash *strings, *members, *subnets, *string_dups;
208a4f4a 28EXEC SQL BEGIN DECLARE SECTION;
29int dcmenable;
30EXEC SQL END DECLARE SECTION;
68bbc9c3 31struct save_queue *modtables, *sq_create();
32int interrupt();
33
34
35main(argc, argv)
36int argc;
37char **argv;
38{
39 char **arg = argv;
208a4f4a 40EXEC SQL BEGIN DECLARE SECTION;
41 char *database;
42EXEC SQL END DECLARE SECTION;
68bbc9c3 43 int ingerr();
44 int countonly = 0;
45
208a4f4a 46 database = "moira";
68bbc9c3 47
48 while (++arg - argv < argc) {
49 if (**arg == '-')
50 switch ((*arg)[1]) {
51 case 'd':
52 debug = atoi((*arg)[2] ? *arg+2 : *++arg);
53 break;
54 case 'n':
55 mode = MODE_NO;
56 break;
57 case 'y':
58 mode = MODE_YES;
59 break;
60 case 'p':
61 mode = MODE_PREEN;
62 break;
63 case 'a':
64 mode = MODE_ASK;
65 break;
66 case 'c':
67 countonly++;
68 break;
69 case 'f':
70 fast++;
71 break;
72 case 'w':
73 warn = 0;
74 break;
75 default:
76 printf("Usage: %s [-d level] [-n] [-y] [-p] [-a] [-c] [-f] [-w] [database]\n",
77 argv[0]);
78 exit(1);
79 }
80 else
81 database = *arg;
82 }
83 if (countonly)
84 printf("Only doing counts\n");
85 else if (fast)
86 printf("Doing fast version (skipping some checks)\n");
87 if (mode == MODE_NO)
88 printf("Will NOT modify the database\n");
89 else if (mode == MODE_PREEN)
90 printf("Will fix simple things without asking\n");
91 else if (mode == MODE_YES)
92 printf("Will fix everything without asking\n");
93 if (debug)
94 printf("Debug level is %d\n", debug);
95
96 setlinebuf(stdout);
97
98 signal(SIGHUP, interrupt);
99 signal(SIGQUIT, interrupt);
100 signal(SIGINT, interrupt);
101 modtables = sq_create();
102
103 IIseterr(ingerr);
104 printf("Opening database %s...", database);
105 fflush(stdout);
208a4f4a 106 EXEC SQL CONNECT :database;
68bbc9c3 107 printf("done\n");
208a4f4a 108 EXEC SQL SELECT value INTO :dcmenable FROM numvalues
109 WHERE name='dcm_enable';
68bbc9c3 110 dprintf("DCM disabled (was %d)\n", dcmenable);
208a4f4a 111 EXEC SQL UPDATE numvalues SET value=0 WHERE name='dcm_enable';
68bbc9c3 112
208a4f4a 113 /* Begin transaction here. */
68bbc9c3 114
115 if (!countonly) {
116 phase1();
37229b80 117 EXEC SQL COMMIT WORK;
68bbc9c3 118 phase2();
37229b80 119 EXEC SQL COMMIT WORK;
68bbc9c3 120 phase3();
37229b80 121 EXEC SQL COMMIT WORK;
68bbc9c3 122 } else {
123 count_only_setup();
37229b80 124 EXEC SQL COMMIT WORK;
68bbc9c3 125 }
126 phase4();
208a4f4a 127 EXEC SQL COMMIT WORK;
128
68bbc9c3 129 cleanup();
130 printf("Done.\n");
131 exit(0);
132}
133
134ingerr(num)
135int *num;
136{
ab05f33a 137EXEC SQL BEGIN DECLARE SECTION;
138 char buf[512];
139EXEC SQL END DECLARE SECTION;
140
f0888cca 141 if (*num == 100) return;
ab05f33a 142 printf("An ingres error occurred, code %d\n", *num);
143 EXEC SQL INQUIRE_SQL(:buf = errortext);
144 printf("%s\n", buf);
68bbc9c3 145 printf("Aborting...\n");
208a4f4a 146 if (!abort_p) {
147 abort_p++;
148 EXEC SQL ROLLBACK WORK;
68bbc9c3 149 }
150 exit(1);
151}
152
153
154int interrupt()
208a4f4a 155{
68bbc9c3 156 printf("Signal caught\n");
157 if (prompt("Save database changes")) {
158 /* break out of a retrieve loop */
159 IIbreak();
208a4f4a 160
161 EXEC SQL COMMIT WORK;
68bbc9c3 162 cleanup();
163 exit(0);
164 }
165 printf("Aborting transaction\n");
208a4f4a 166 if (!abort_p) {
167 abort_p++;
68bbc9c3 168 /* break out of a retrieve loop */
169 IIbreak();
208a4f4a 170 EXEC SQL ROLLBACK WORK;
68bbc9c3 171 }
208a4f4a 172
208a4f4a 173 EXEC SQL UPDATE numvalues SET value=:dcmenable
174 WHERE name='dcm_enable';
175
68bbc9c3 176 exit(0);
208a4f4a 177}
68bbc9c3 178
179
180modified(table)
181char *table;
182{
183 sq_save_unique_string(modtables, table);
184}
185
186cleanup()
208a4f4a 187{
188 EXEC SQL BEGIN DECLARE SECTION;
189 char *tab;
190 EXEC SQL END DECLARE SECTION;
68bbc9c3 191
192 while (sq_get_data(modtables, &tab)) {
208a4f4a 193 EXEC SQL REPEATED UPDATE tblstats SET modtime='now'
194 WHERE table_name = :tab;
68bbc9c3 195 }
208a4f4a 196 EXEC SQL UPDATE numvalues SET value = :dcmenable
197 WHERE name='dcm_enable';
208a4f4a 198}
68bbc9c3 199
200
201out_of_mem(msg)
202char *msg;
203{
204 fprintf(stderr, "Out of memory while %s\n", msg);
f0888cca 205 if (prompt("Save database changes")) {
206 /* break out of a retrieve loop */
207 IIbreak();
208
209 EXEC SQL COMMIT WORK;
210 cleanup();
211 exit(1);
212 }
213 printf("Aborting transaction\n");
214 IIbreak();
215 EXEC SQL ROLLBACK WORK;
68bbc9c3 216 exit(1);
217}
This page took 0.113856 seconds and 5 git commands to generate.