]> andersk Git - moira.git/blame - dbck/dbck.pc
Add support for get_host_by_account_number query.
[moira.git] / dbck / dbck.pc
CommitLineData
7ac48069 1/* $Id$
68bbc9c3 2 *
3 * Moira database consistency checker
4 *
7ac48069 5 * (c) Copyright 1988-1998 by the Massachusetts Institute of Technology.
6 * For copying and distribution information, please see the file
7 * <mit-copyright.h>.
68bbc9c3 8 */
9
10#include <mit-copyright.h>
7ac48069 11#include <moira.h>
68bbc9c3 12#include "dbck.h"
7ac48069 13
14#include <signal.h>
15#include <stdio.h>
16#include <stdlib.h>
17
ab05f33a 18EXEC SQL INCLUDE sqlca;
4b9e5c72 19EXEC SQL INCLUDE sqlda;
68bbc9c3 20
7ac48069 21RCSID("$Header$");
68bbc9c3 22
23int debug = 0;
24int mode = MODE_ASK;
25int fast = 0;
26int warn = 1;
208a4f4a 27int abort_p = 0;
68bbc9c3 28struct hash *users, *machines, *clusters, *lists, *filesys, *nfsphys;
fe0a844a 29struct hash *strings, *members, *subnets, *string_dups, *printservers;
5eaef520 30EXEC SQL BEGIN DECLARE SECTION;
208a4f4a 31int dcmenable;
5eaef520 32EXEC SQL END DECLARE SECTION;
7ac48069 33struct save_queue *modtables;
4b9e5c72 34SQLDA *mr_sqlda;
68bbc9c3 35
7ac48069 36void interrupt(void);
5eaef520 37extern SQLDA *sqlald(int, int, int);
7ac48069 38extern void sqlglm(char *, unsigned int *, unsigned int *);
68bbc9c3 39
5eaef520 40int main(int argc, char **argv)
68bbc9c3 41{
5eaef520 42 char **arg = argv;
43 EXEC SQL BEGIN DECLARE SECTION;
44 char *database;
45 EXEC SQL END DECLARE SECTION;
7ac48069 46 struct sigaction sa;
5eaef520 47
48 database = "moira";
49 setvbuf(stdout, NULL, _IOLBF, BUFSIZ);
50
51 while (++arg - argv < argc)
52 {
fe0a844a 53 if (**arg == '-')
5eaef520 54 {
55 switch ((*arg)[1])
56 {
57 case 'd':
58 debug = atoi((*arg)[2] ? *arg + 2 : *++arg);
68bbc9c3 59 break;
5eaef520 60 case 'n':
68bbc9c3 61 mode = MODE_NO;
62 break;
5eaef520 63 case 'y':
68bbc9c3 64 mode = MODE_YES;
65 break;
5eaef520 66 case 'p':
68bbc9c3 67 mode = MODE_PREEN;
68 break;
5eaef520 69 case 'a':
68bbc9c3 70 mode = MODE_ASK;
71 break;
5eaef520 72 case 'f':
68bbc9c3 73 fast++;
74 break;
5eaef520 75 case 'w':
68bbc9c3 76 warn = 0;
77 break;
5eaef520 78 default:
cfc4f91e 79 printf("Usage: %s [-d level] [-n] [-y] [-p] [-a] [-f] [-w] [database]\n",
68bbc9c3 80 argv[0]);
81 exit(1);
5eaef520 82 }
83 }
84 else
85 database = *arg;
86 }
cfc4f91e 87 if (fast)
5eaef520 88 printf("Doing fast version (skipping some checks)\n");
89 if (mode == MODE_NO)
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");
95 if (debug)
96 printf("Debug level is %d\n", debug);
97
7ac48069 98 sa.sa_handler = interrupt;
99 sa.sa_flags = 0;
100 sigemptyset(&sa.sa_mask);
101 sigaction(SIGHUP, &sa, NULL);
102 sigaction(SIGQUIT, &sa, NULL);
103 sigaction(SIGINT, &sa, NULL);
5eaef520 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");
ad2bb6af 113 if (mode != MODE_NO)
114 {
115 EXEC SQL SELECT value INTO :dcmenable FROM numvalues
116 WHERE name = 'dcm_enable';
117 dprintf("DCM disabled (was %d)\n", dcmenable);
118 EXEC SQL UPDATE numvalues SET value = 0 WHERE name = 'dcm_enable';
119 }
5eaef520 120
121 /* Begin transaction here. */
122
cfc4f91e 123 phase1();
124 EXEC SQL COMMIT WORK;
125 phase2();
126 EXEC SQL COMMIT WORK;
127 phase3();
128 EXEC SQL COMMIT WORK;
5eaef520 129 phase4();
130 EXEC SQL COMMIT WORK;
208a4f4a 131
5eaef520 132 cleanup();
133 printf("Done.\n");
134 exit(0);
68bbc9c3 135}
136
7ac48069 137void dbmserr(void)
68bbc9c3 138{
5eaef520 139 EXEC SQL BEGIN DECLARE SECTION;
cfc4f91e 140 char buf[256];
5eaef520 141 EXEC SQL END DECLARE SECTION;
142 int bufsize = 256, msglength = 0;
143
144 if (sqlca.sqlcode == 1403)
145 return;
7ac48069 146 printf("A DBMS error occurred, code %ld\n", sqlca.sqlcode);
5eaef520 147 sqlglm(buf, &bufsize, &msglength);
148 buf[msglength] = '\0';
149 printf("%s\n", buf);
150 printf("Aborting...\n");
151 if (!abort_p)
152 {
153 abort_p++;
154 EXEC SQL ROLLBACK WORK;
68bbc9c3 155 }
5eaef520 156 exit(1);
68bbc9c3 157}
158
159
5eaef520 160void interrupt(void)
208a4f4a 161{
5eaef520 162 printf("Signal caught\n");
163 if (prompt("Save database changes"))
164 {
165 EXEC SQL COMMIT WORK;
166 cleanup();
167 exit(0);
68bbc9c3 168 }
5eaef520 169 printf("Aborting transaction\n");
170 if (!abort_p)
171 {
172 abort_p++;
173 EXEC SQL ROLLBACK WORK;
68bbc9c3 174 }
208a4f4a 175
5eaef520 176 EXEC SQL UPDATE numvalues SET value = :dcmenable
177 WHERE name = 'dcm_enable';
208a4f4a 178
5eaef520 179 exit(0);
208a4f4a 180}
68bbc9c3 181
182
7ac48069 183void modified(char *table)
68bbc9c3 184{
5eaef520 185 sq_save_unique_string(modtables, table);
68bbc9c3 186}
187
7ac48069 188void cleanup(void)
208a4f4a 189{
5eaef520 190 EXEC SQL BEGIN DECLARE SECTION;
191 char *tab;
192 EXEC SQL END DECLARE SECTION;
193
194 while (sq_get_data(modtables, &tab))
195 {
196 EXEC SQL UPDATE tblstats SET modtime = SYSDATE
197 WHERE table_name = :tab;
68bbc9c3 198 }
5eaef520 199 EXEC SQL UPDATE numvalues SET value = :dcmenable
200 WHERE name = 'dcm_enable';
208a4f4a 201}
68bbc9c3 202
203
7ac48069 204void out_of_mem(char *msg)
68bbc9c3 205{
5eaef520 206 fprintf(stderr, "Out of memory while %s\n", msg);
207 if (prompt("Save database changes"))
208 {
209 EXEC SQL COMMIT WORK;
210 cleanup();
211 exit(1);
f0888cca 212 }
5eaef520 213 printf("Aborting transaction\n");
214 EXEC SQL ROLLBACK WORK;
215 exit(1);
68bbc9c3 216}
This page took 0.371208 seconds and 5 git commands to generate.