3 * User interface routines for dbck (Moira database consistency checker)
5 * (c) Copyright 1988-1998 by the Massachusetts Institute of Technology.
6 * For copying and distribution information, please see the file
10 #include <mit-copyright.h>
16 EXEC SQL INCLUDE sqlca; /* SQL Communications Area */
17 EXEC SQL INCLUDE sqlda; /* SQL Descriptor Area */
21 EXEC SQL BEGIN DECLARE SECTION;
25 EXEC SQL END DECLARE SECTION;
27 extern SQLDA *mr_sqlda;
28 void generic_ffunc(void *id);
30 void generic_ffunc(void *id)
34 sprintf(stmt_buf, "DELETE FROM %s WHERE %s.%s = %d",
35 _table, _table, _idfield, (int)id);
36 EXEC SQL EXECUTE IMMEDIATE :stmt_buf;
37 rowcount = sqlca.sqlerrd[2];
39 printf("%d entr%s deleted\n", rowcount, rowcount == 1 ? "y" : "ies");
41 printf("Not deleted\n");
46 void generic_delete(struct save_queue *sq, int (*pfunc)(void *), char *table,
47 char *idfield, int preen)
51 generic_fix(sq, pfunc, "Delete", generic_ffunc, preen);
55 void single_delete(char *table, char *idfield, int id)
59 generic_ffunc((void *)id);
63 void zero_fix(char *tbl, char *zrfield, char *idfield, int id)
67 sprintf(stmt_buf, "UPDATE %s SET %s = 0 WHERE %s.%s = %d",
68 tbl, zrfield, tbl, idfield, id);
69 EXEC SQL EXECUTE IMMEDIATE :stmt_buf;
70 rowcount = sqlca.sqlerrd[2];
72 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
74 printf("Not fixed\n");
79 int single_fix(char *msg, int preen)
81 if (mode == MODE_PREEN)
99 void generic_fix(struct save_queue *sq, int (*pfunc)(void *), char *msg,
100 void (*ffunc)(void *), int preen)
104 while (sq_get_data(sq, &id))
106 if ((*pfunc)((void *)id) == 0 && single_fix(msg, preen))
107 (*ffunc)((void *)id);
113 int prompt(char *msg)
116 EXEC SQL BEGIN DECLARE SECTION;
117 extern int dcmenable;
118 EXEC SQL END DECLARE SECTION;
122 printf("%s (Y/N/Q)? ", msg);
125 if (buf[0] == 'Y' || buf[0] == 'y')
127 if (buf[0] == 'N' || buf[0] == 'n')
129 if (buf[0] == 'Q' || buf[0] == 'q')
131 if (prompt("Are you sure you want to quit"))
133 if (prompt("Save database changes"))
135 EXEC SQL COMMIT WORK;
141 EXEC SQL ROLLBACK WORK;
142 EXEC SQL UPDATE numvalues SET value = :dcmenable
143 WHERE name = 'dcm_enable';
153 ** set_next_object_id - set next object id in values table
155 ** Inputs: object - object name in values table and in objects
156 ** table - name of table objects are found in
158 ** - called before an APPEND operation to set the next object id to
159 ** be used for the new record to the next free value
163 int set_next_object_id(char *object, char *tablename)
165 EXEC SQL BEGIN DECLARE SECTION;
167 char stmt_buf[256], out_buf[256];
168 EXEC SQL END DECLARE SECTION;
169 int starting_value, errcode = 0;
171 EXEC SQL SELECT value INTO :value FROM numvalues WHERE name = :object;
172 if (sqlca.sqlerrd[2] != 1)
175 starting_value = value;
178 if (value > MAX_ID_VALUE)
179 value = MIN_ID_VALUE;
181 sprintf(stmt_buf, "SELECT %s FROM %s WHERE %s = %d",
182 object, tablename, object, value);
183 EXEC SQL PREPARE inc_stmt FROM :stmt_buf;
184 EXEC SQL DECLARE inc_crs CURSOR FOR inc_stmt;
185 EXEC SQL OPEN inc_crs;
187 EXEC SQL DESCRIBE SELECT LIST FOR inc_stmt INTO mr_sqlda;
188 mr_sqlda->N = mr_sqlda->F;
189 mr_sqlda->V[0] = out_buf;
191 mr_sqlda->L[0] = 255;
192 EXEC SQL FETCH inc_crs USING DESCRIPTOR mr_sqlda;
194 /* if we got an error from the FETCH, we have to preserve it or the
195 close will reset it and the caller with think nothing happened */
197 errcode = sqlca.sqlcode;
199 EXEC SQL CLOSE inc_crs;
206 if (value == starting_value)
210 printf("setting ID %s to %d\n", object, value);
211 EXEC SQL UPDATE numvalues SET value = :value WHERE name = :object;
217 int generic_fix_id(char *tbl, char *idfield, char *txtfield,
218 int oldid, char *name)
220 EXEC SQL BEGIN DECLARE SECTION;
222 EXEC SQL END DECLARE SECTION;
224 set_next_object_id(tbl, idfield);
225 EXEC SQL SELECT value INTO :id FROM numvalues WHERE name = :idfield;
226 sprintf(stmt_buf, "UPDATE %s SET %s = %d WHERE %s = %d AND %s = '%s'",
227 tbl, idfield, id, idfield, oldid, txtfield, name);
228 EXEC SQL EXECUTE IMMEDIATE :stmt_buf;
229 rowcount = sqlca.sqlerrd[2];
233 printf("Not fixed, rowcount = %d\n", rowcount);