]> andersk Git - moira.git/blame - dbck/dbck.pc
Code style cleanup. (No functional changes)
[moira.git] / dbck / dbck.pc
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>
23a784eb 12#include <string.h>
68bbc9c3 13#include <signal.h>
14#include "dbck.h"
ab05f33a 15EXEC SQL INCLUDE sqlca;
4b9e5c72 16EXEC SQL INCLUDE sqlda;
68bbc9c3 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;
5eaef520 28EXEC SQL BEGIN DECLARE SECTION;
208a4f4a 29int dcmenable;
5eaef520 30EXEC SQL END DECLARE SECTION;
68bbc9c3 31struct save_queue *modtables, *sq_create();
4b9e5c72 32void interrupt();
33SQLDA *mr_sqlda;
68bbc9c3 34
5eaef520 35extern SQLDA *sqlald(int, int, int);
68bbc9c3 36
5eaef520 37int main(int argc, char **argv)
68bbc9c3 38{
5eaef520 39 char **arg = argv;
40 EXEC SQL BEGIN DECLARE SECTION;
41 char *database;
42 EXEC SQL END DECLARE SECTION;
43 int ingerr();
44 int countonly = 0;
45
46 database = "moira";
47 setvbuf(stdout, NULL, _IOLBF, BUFSIZ);
48
49 while (++arg - argv < argc)
50 {
51 if (**arg == '-')
52 {
53 switch ((*arg)[1])
54 {
55 case 'd':
56 debug = atoi((*arg)[2] ? *arg + 2 : *++arg);
68bbc9c3 57 break;
5eaef520 58 case 'n':
68bbc9c3 59 mode = MODE_NO;
60 break;
5eaef520 61 case 'y':
68bbc9c3 62 mode = MODE_YES;
63 break;
5eaef520 64 case 'p':
68bbc9c3 65 mode = MODE_PREEN;
66 break;
5eaef520 67 case 'a':
68bbc9c3 68 mode = MODE_ASK;
69 break;
5eaef520 70 case 'c':
68bbc9c3 71 countonly++;
72 break;
5eaef520 73 case 'f':
68bbc9c3 74 fast++;
75 break;
5eaef520 76 case 'w':
68bbc9c3 77 warn = 0;
78 break;
5eaef520 79 default:
68bbc9c3 80 printf("Usage: %s [-d level] [-n] [-y] [-p] [-a] [-c] [-f] [-w] [database]\n",
81 argv[0]);
82 exit(1);
5eaef520 83 }
84 }
85 else
86 database = *arg;
87 }
88 if (countonly)
89 printf("Only doing counts\n");
90 else if (fast)
91 printf("Doing fast version (skipping some checks)\n");
92 if (mode == MODE_NO)
93 printf("Will NOT modify the database\n");
94 else if (mode == MODE_PREEN)
95 printf("Will fix simple things without asking\n");
96 else if (mode == MODE_YES)
97 printf("Will fix everything without asking\n");
98 if (debug)
99 printf("Debug level is %d\n", debug);
100
101 signal(SIGHUP, interrupt);
102 signal(SIGQUIT, interrupt);
103 signal(SIGINT, interrupt);
104
105 modtables = sq_create();
106 mr_sqlda = sqlald(1, 255, 0);
107
108 EXEC SQL WHENEVER SQLERROR DO dbmserr();
109 printf("Opening database %s...", database);
110 fflush(stdout);
111 EXEC SQL CONNECT :database IDENTIFIED BY :database;
112 printf("done\n");
113 EXEC SQL SELECT value INTO :dcmenable FROM numvalues
114 WHERE name = 'dcm_enable';
115 dprintf("DCM disabled (was %d)\n", dcmenable);
116 EXEC SQL UPDATE numvalues SET value = 0 WHERE name = 'dcm_enable';
117
118 /* Begin transaction here. */
119
120 if (!countonly)
121 {
122 phase1();
123 EXEC SQL COMMIT WORK;
124 phase2();
125 EXEC SQL COMMIT WORK;
126 phase3();
127 EXEC SQL COMMIT WORK;
68bbc9c3 128 }
5eaef520 129 else
130 {
131 count_only_setup();
132 EXEC SQL COMMIT WORK;
68bbc9c3 133 }
5eaef520 134 phase4();
135 EXEC SQL COMMIT WORK;
208a4f4a 136
5eaef520 137 cleanup();
138 printf("Done.\n");
139 exit(0);
68bbc9c3 140}
141
5eaef520 142int dbmserr(void)
68bbc9c3 143{
5eaef520 144 EXEC SQL BEGIN DECLARE SECTION;
145 char buf[512];
146 EXEC SQL END DECLARE SECTION;
147 int bufsize = 256, msglength = 0;
148
149 if (sqlca.sqlcode == 1403)
150 return;
151 printf("A DBMS error occurred, code %d\n", sqlca.sqlcode);
152 sqlglm(buf, &bufsize, &msglength);
153 buf[msglength] = '\0';
154 printf("%s\n", buf);
155 printf("Aborting...\n");
156 if (!abort_p)
157 {
158 abort_p++;
159 EXEC SQL ROLLBACK WORK;
68bbc9c3 160 }
5eaef520 161 exit(1);
68bbc9c3 162}
163
164
5eaef520 165void interrupt(void)
208a4f4a 166{
5eaef520 167 printf("Signal caught\n");
168 if (prompt("Save database changes"))
169 {
170 EXEC SQL COMMIT WORK;
171 cleanup();
172 exit(0);
68bbc9c3 173 }
5eaef520 174 printf("Aborting transaction\n");
175 if (!abort_p)
176 {
177 abort_p++;
178 EXEC SQL ROLLBACK WORK;
68bbc9c3 179 }
208a4f4a 180
5eaef520 181 EXEC SQL UPDATE numvalues SET value = :dcmenable
182 WHERE name = 'dcm_enable';
208a4f4a 183
5eaef520 184 exit(0);
208a4f4a 185}
68bbc9c3 186
187
5eaef520 188int modified(char *table)
68bbc9c3 189{
5eaef520 190 sq_save_unique_string(modtables, table);
68bbc9c3 191}
192
5eaef520 193int cleanup(void)
208a4f4a 194{
5eaef520 195 EXEC SQL BEGIN DECLARE SECTION;
196 char *tab;
197 EXEC SQL END DECLARE SECTION;
198
199 while (sq_get_data(modtables, &tab))
200 {
201 EXEC SQL UPDATE tblstats SET modtime = SYSDATE
202 WHERE table_name = :tab;
68bbc9c3 203 }
5eaef520 204 EXEC SQL UPDATE numvalues SET value = :dcmenable
205 WHERE name = 'dcm_enable';
208a4f4a 206}
68bbc9c3 207
208
5eaef520 209int out_of_mem(char *msg)
68bbc9c3 210{
5eaef520 211 fprintf(stderr, "Out of memory while %s\n", msg);
212 if (prompt("Save database changes"))
213 {
214 EXEC SQL COMMIT WORK;
215 cleanup();
216 exit(1);
f0888cca 217 }
5eaef520 218 printf("Aborting transaction\n");
219 EXEC SQL ROLLBACK WORK;
220 exit(1);
68bbc9c3 221}
This page took 0.089076 seconds and 5 git commands to generate.