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