3 * User interface routines for dbck (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; /* SQL Communications Area */
16 EXEC SQL INCLUDE sqlda; /* SQL Descriptor Area */
18 static char fix_qc_rcsid[] = "$Header$";
20 EXEC SQL BEGIN DECLARE SECTION;
24 EXEC SQL END DECLARE SECTION;
26 extern SQLDA *mr_sqlda;
29 EXEC SQL BEGIN DECLARE SECTION;
31 EXEC SQL END DECLARE SECTION;
33 EXEC SQL BEGIN DECLARE SECTION;
35 EXEC SQL END DECLARE SECTION;
37 sprintf(stmt_buf,"DELETE FROM %s WHERE %s.%s = %d",
38 _table,_table,_idfield,id);
39 EXEC SQL EXECUTE IMMEDIATE :stmt_buf;
40 rowcount = sqlca.sqlerrd[2];
42 printf("%d entr%s deleted\n", rowcount, rowcount==1?"y":"ies");
44 printf("Not deleted\n");
49 generic_delete(sq, pfunc, table, idfield, preen)
50 struct save_queue *sq;
52 char *table, *idfield;
57 generic_fix(sq, pfunc, "Delete", generic_ffunc, preen);
61 single_delete(table, idfield, id)
62 char *table, *idfield;
71 zero_fix(tbl, zrfield, idfield, id)
72 EXEC SQL BEGIN DECLARE SECTION;
73 char *tbl, *zrfield, *idfield;
75 EXEC SQL END DECLARE SECTION;
77 EXEC SQL BEGIN DECLARE SECTION;
79 EXEC SQL END DECLARE SECTION;
81 sprintf(stmt_buf,"UPDATE %s SET %s = 0 WHERE %s.%s = %d",
82 tbl,zrfield,tbl,idfield,id);
83 EXEC SQL EXECUTE IMMEDIATE :stmt_buf;
84 rowcount = sqlca.sqlerrd[2];
86 printf("%d entr%s fixed\n", rowcount, rowcount==1?"y":"ies");
88 printf("Not fixed\n");
93 int single_fix(msg, preen)
97 if (mode == MODE_PREEN)
114 generic_fix(sq, pfunc, msg, ffunc, preen)
115 struct save_queue *sq;
117 int (*pfunc)(), (*ffunc)();
122 while (sq_get_data(sq, &id)) {
123 if ((*pfunc)(id) == 0 && single_fix(msg, preen))
134 EXEC SQL BEGIN DECLARE SECTION;
135 extern int dcmenable;
136 EXEC SQL END DECLARE SECTION;
139 printf("%s (Y/N/Q)? ", msg);
142 if (buf[0] == 'Y' || buf[0] == 'y')
144 if (buf[0] == 'N' || buf[0] == 'n')
146 if (buf[0] == 'Q' || buf[0] == 'q') {
147 if (prompt("Are you sure you want to quit")) {
148 if (prompt("Save database changes")) {
149 EXEC SQL COMMIT WORK;
153 EXEC SQL ROLLBACK WORK;
154 EXEC SQL UPDATE numvalues SET value = :dcmenable
155 WHERE name='dcm_enable';
165 ** set_next_object_id - set next object id in values table
167 ** Inputs: object - object name in values table and in objects
168 ** table - name of table objects are found in
170 ** - called before an APPEND operation to set the next object id to
171 ** be used for the new record to the next free value
175 int set_next_object_id(object, tablename)
176 EXEC SQL BEGIN DECLARE SECTION;
178 EXEC SQL END DECLARE SECTION;
181 EXEC SQL BEGIN DECLARE SECTION;
183 char stmt_buf[256], out_buf[256];
184 EXEC SQL END DECLARE SECTION;
185 int starting_value, errcode=0;
187 EXEC SQL SELECT value INTO :value FROM numvalues WHERE name = :object;
188 if (sqlca.sqlerrd[2] != 1)
191 starting_value=value;
193 if (value > MAX_ID_VALUE) value = MIN_ID_VALUE;
195 sprintf(stmt_buf, "SELECT %s FROM %s WHERE %s=%d",
196 object, tablename, object, value);
197 EXEC SQL PREPARE inc_stmt FROM :stmt_buf;
198 EXEC SQL DECLARE inc_crs CURSOR FOR inc_stmt;
199 EXEC SQL OPEN inc_crs;
201 EXEC SQL DESCRIBE SELECT LIST FOR inc_stmt INTO mr_sqlda;
202 mr_sqlda->N = mr_sqlda->F;
203 mr_sqlda->V[0]=out_buf;
206 EXEC SQL FETCH inc_crs USING DESCRIPTOR mr_sqlda;
208 /* if we got an error from the FETCH, we have to preserve it or the
209 close will reset it and the caller with think nothing happened */
210 if(sqlca.sqlcode) errcode=sqlca.sqlcode;
212 EXEC SQL CLOSE inc_crs;
213 if (errcode < 0) return(MR_DBMS_ERR);
214 if (errcode == 1403) break;
217 if (value == starting_value) return (MR_NO_ID);
220 printf("setting ID %s to %d\n", object, value);
221 EXEC SQL UPDATE numvalues SET value = :value WHERE name = :object;
227 generic_fix_id(tbl, idfield, txtfield, oldid, name)
228 EXEC SQL BEGIN DECLARE SECTION;
234 EXEC SQL END DECLARE SECTION;
236 EXEC SQL BEGIN DECLARE SECTION;
238 EXEC SQL END DECLARE SECTION;
240 set_next_object_id(tbl, idfield);
241 EXEC SQL SELECT value INTO :id FROM numvalues
242 WHERE name = :idfield;
243 sprintf(stmt_buf,"UPDATE %s SET %s = %d WHERE %s=%d AND %s='%s'",
244 tbl,idfield,id,idfield,oldid,txtfield,name);
245 EXEC SQL EXECUTE IMMEDIATE :stmt_buf;
246 rowcount = sqlca.sqlerrd[2];
250 printf("Not fixed, rowcount = %d\n", rowcount);