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>
15 EXEC SQL INCLUDE sqlca;
16 EXEC SQL INCLUDE sqlda;
18 static char dbck_qc_rcsid[] = "$Header$";
26 struct hash *users, *machines, *clusters, *lists, *filesys, *nfsphys;
27 struct hash *strings, *members, *subnets, *string_dups;
28 EXEC SQL BEGIN DECLARE SECTION;
30 EXEC SQL END DECLARE SECTION;
31 struct save_queue *modtables, *sq_create();
41 EXEC SQL BEGIN DECLARE SECTION;
43 EXEC SQL END DECLARE SECTION;
48 setvbuf(stdout, NULL, _IOLBF, BUFSIZ);
50 while (++arg - argv < argc) {
54 debug = atoi((*arg)[2] ? *arg+2 : *++arg);
78 printf("Usage: %s [-d level] [-n] [-y] [-p] [-a] [-c] [-f] [-w] [database]\n",
86 printf("Only doing counts\n");
88 printf("Doing fast version (skipping some checks)\n");
90 printf("Will NOT modify the database\n");
91 else if (mode == MODE_PREEN)
92 printf("Will fix simple things without asking\n");
93 else if (mode == MODE_YES)
94 printf("Will fix everything without asking\n");
96 printf("Debug level is %d\n", debug);
98 signal(SIGHUP, interrupt);
99 signal(SIGQUIT, interrupt);
100 signal(SIGINT, interrupt);
102 modtables = sq_create();
103 mr_sqlda = sqlald(1, 255, 0);
105 EXEC SQL WHENEVER SQLERROR DO dbmserr();
106 printf("Opening database %s...", database);
108 EXEC SQL CONNECT :database IDENTIFIED BY :database;
110 EXEC SQL SELECT value INTO :dcmenable FROM numvalues
111 WHERE name='dcm_enable';
112 dprintf("DCM disabled (was %d)\n", dcmenable);
113 EXEC SQL UPDATE numvalues SET value=0 WHERE name='dcm_enable';
115 /* Begin transaction here. */
119 EXEC SQL COMMIT WORK;
121 EXEC SQL COMMIT WORK;
123 EXEC SQL COMMIT WORK;
126 EXEC SQL COMMIT WORK;
129 EXEC SQL COMMIT WORK;
138 EXEC SQL BEGIN DECLARE SECTION;
140 EXEC SQL END DECLARE SECTION;
141 int bufsize=256, msglength=0;
143 if (sqlca.sqlcode==1403) return;
144 printf("A DBMS error occurred, code %d\n", sqlca.sqlcode);
145 sqlglm(buf, &bufsize, &msglength);
148 printf("Aborting...\n");
151 EXEC SQL ROLLBACK WORK;
159 printf("Signal caught\n");
160 if (prompt("Save database changes")) {
161 EXEC SQL COMMIT WORK;
165 printf("Aborting transaction\n");
168 EXEC SQL ROLLBACK WORK;
171 EXEC SQL UPDATE numvalues SET value=:dcmenable
172 WHERE name='dcm_enable';
181 sq_save_unique_string(modtables, table);
186 EXEC SQL BEGIN DECLARE SECTION;
188 EXEC SQL END DECLARE SECTION;
190 while (sq_get_data(modtables, &tab)) {
191 EXEC SQL UPDATE tblstats SET modtime=SYSDATE
192 WHERE table_name = :tab;
194 EXEC SQL UPDATE numvalues SET value = :dcmenable
195 WHERE name='dcm_enable';
202 fprintf(stderr, "Out of memory while %s\n", msg);
203 if (prompt("Save database changes")) {
204 EXEC SQL COMMIT WORK;
208 printf("Aborting transaction\n");
209 EXEC SQL ROLLBACK WORK;