3 * Moira database consistency checker
5 * (c) Copyright 1988 by the Massachusetts Institute of Technology.
6 * For copying and distribution information, please see the file
10 #include <mit-copyright.h>
17 static char dbck_qc_rcsid[] = "$Header$";
25 struct hash *users, *machines, *clusters, *lists, *filesys, *nfsphys;
26 struct hash *strings, *members, *subnets;
27 EXEC SQL BEGIN DECLARE SECTION;
29 EXEC SQL END DECLARE SECTION;
30 struct save_queue *modtables, *sq_create();
39 EXEC SQL BEGIN DECLARE SECTION;
41 EXEC SQL END DECLARE SECTION;
47 while (++arg - argv < argc) {
51 debug = atoi((*arg)[2] ? *arg+2 : *++arg);
75 printf("Usage: %s [-d level] [-n] [-y] [-p] [-a] [-c] [-f] [-w] [database]\n",
83 printf("Only doing counts\n");
85 printf("Doing fast version (skipping some checks)\n");
87 printf("Will NOT modify the database\n");
88 else if (mode == MODE_PREEN)
89 printf("Will fix simple things without asking\n");
90 else if (mode == MODE_YES)
91 printf("Will fix everything without asking\n");
93 printf("Debug level is %d\n", debug);
97 signal(SIGHUP, interrupt);
98 signal(SIGQUIT, interrupt);
99 signal(SIGINT, interrupt);
100 modtables = sq_create();
103 printf("Opening database %s...", database);
105 EXEC SQL CONNECT :database;
107 EXEC SQL SELECT value INTO :dcmenable FROM numvalues
108 WHERE name='dcm_enable';
109 dprintf("DCM disabled (was %d)\n", dcmenable);
110 EXEC SQL UPDATE numvalues SET value=0 WHERE name='dcm_enable';
112 /* Begin transaction here. */
116 EXEC SQL COMMIT WORK;
118 EXEC SQL COMMIT WORK;
120 EXEC SQL COMMIT WORK;
123 EXEC SQL COMMIT WORK;
127 EXEC SQL COMMIT WORK;
137 if (*num == 100) return;
138 printf("An ingres error occuurred, code %d\n", *num);
139 printf("Aborting...\n");
142 EXEC SQL ROLLBACK WORK;
150 printf("Signal caught\n");
151 if (prompt("Save database changes")) {
152 /* break out of a retrieve loop */
155 EXEC SQL COMMIT WORK;
159 printf("Aborting transaction\n");
162 /* break out of a retrieve loop */
164 EXEC SQL ROLLBACK WORK;
167 EXEC SQL UPDATE numvalues SET value=:dcmenable
168 WHERE name='dcm_enable';
177 sq_save_unique_string(modtables, table);
182 EXEC SQL BEGIN DECLARE SECTION;
184 EXEC SQL END DECLARE SECTION;
186 while (sq_get_data(modtables, &tab)) {
187 EXEC SQL REPEATED UPDATE tblstats SET modtime='now'
188 WHERE table_name = :tab;
190 EXEC SQL UPDATE numvalues SET value = :dcmenable
191 WHERE name='dcm_enable';
198 fprintf(stderr, "Out of memory while %s\n", msg);
199 if (prompt("Save database changes")) {
200 /* break out of a retrieve loop */
203 EXEC SQL COMMIT WORK;
207 printf("Aborting transaction\n");
209 EXEC SQL ROLLBACK WORK;