#include <stdio.h>
#include "dbck.h"
-static char fix_qc_rcsid[] = "$Header$";
+EXEC SQL INCLUDE sqlca; /* SQL Communications Area */
+EXEC SQL INCLUDE sqlda; /* SQL Descriptor Area */
+static char fix_qc_rcsid[] = "$Header$";
-##char *_table;
-##char *_idfield;
+EXEC SQL BEGIN DECLARE SECTION;
+char *_table;
+char *_idfield;
+char stmt_buf[500];
+EXEC SQL END DECLARE SECTION;
-##generic_ffunc(id)
-##int id;
-##{
-## int rowcount;
+extern SQLDA *mr_sqlda;
-## delete _table where _table._idfield = id
-## inquire_equel(rowcount = "rowcount")
+generic_ffunc(id)
+EXEC SQL BEGIN DECLARE SECTION;
+int id;
+EXEC SQL END DECLARE SECTION;
+{
+ EXEC SQL BEGIN DECLARE SECTION;
+ int rowcount;
+ EXEC SQL END DECLARE SECTION;
+
+ sprintf(stmt_buf,"DELETE FROM %s WHERE %s.%s = %d",
+ _table,_table,_idfield,id);
+ EXEC SQL EXECUTE IMMEDIATE :stmt_buf;
+ rowcount = sqlca.sqlerrd[2];
if (rowcount > 0)
printf("%d entr%s deleted\n", rowcount, rowcount==1?"y":"ies");
else
printf("Not deleted\n");
modified(_table);
-##}
+}
generic_delete(sq, pfunc, table, idfield, preen)
}
-##zero_fix(table, zrfield, idfield, id)
-##char *table, *zrfield, *idfield;
-##int id;
-##{
-## int rowcount;
-
-## replace table (zrfield = 0) where table.idfield = id
-## inquire_equel(rowcount = "rowcount")
+zero_fix(tbl, zrfield, idfield, id)
+EXEC SQL BEGIN DECLARE SECTION;
+char *tbl, *zrfield, *idfield;
+int id;
+EXEC SQL END DECLARE SECTION;
+{
+ EXEC SQL BEGIN DECLARE SECTION;
+ int rowcount;
+ EXEC SQL END DECLARE SECTION;
+
+ sprintf(stmt_buf,"UPDATE %s SET %s = 0 WHERE %s.%s = %d",
+ tbl,zrfield,tbl,idfield,id);
+ EXEC SQL EXECUTE IMMEDIATE :stmt_buf;
+ rowcount = sqlca.sqlerrd[2];
if (rowcount > 0)
printf("%d entr%s fixed\n", rowcount, rowcount==1?"y":"ies");
else
printf("Not fixed\n");
- modified(table);
-##}
+ modified(tbl);
+}
int single_fix(msg, preen)
char *msg;
{
char buf[BUFSIZ];
-## extern int dcmenable;
+ EXEC SQL BEGIN DECLARE SECTION;
+ extern int dcmenable;
+ EXEC SQL END DECLARE SECTION;
while (1) {
printf("%s (Y/N/Q)? ", msg);
if (buf[0] == 'Q' || buf[0] == 'q') {
if (prompt("Are you sure you want to quit")) {
if (prompt("Save database changes")) {
-## end transaction
+ EXEC SQL COMMIT WORK;
cleanup();
exit(0);
} else {
-## abort
-## replace values (value = dcmenable)
-## where values.name = "dcm_enable"
-## exit
+ EXEC SQL ROLLBACK WORK;
+ EXEC SQL UPDATE numvalues SET value = :dcmenable
+ WHERE name='dcm_enable';
exit(1);
}
}
**
**/
-int set_next_object_id(object, table)
+int set_next_object_id(object, tablename)
+EXEC SQL BEGIN DECLARE SECTION;
char *object;
- char *table;
-##{
-## char *name, *tbl;
-## int rowcount, exists, value;
-
- name = object;
- tbl = table;
-## range of v is values
-## repeat retrieve (value = v.#value) where v.#name = @name
-## inquire_equel(rowcount = "rowcount")
- if (rowcount != 1)
+EXEC SQL END DECLARE SECTION;
+ char *tablename;
+{
+ EXEC SQL BEGIN DECLARE SECTION;
+ int value;
+ char stmt_buf[256], out_buf[256];
+ EXEC SQL END DECLARE SECTION;
+ int starting_value, errcode=0;
+
+ EXEC SQL SELECT value INTO :value FROM numvalues WHERE name = :object;
+ if (sqlca.sqlerrd[2] != 1)
return(MR_NO_ID);
-## retrieve (exists = any(tbl.name where tbl.name = value))
-## inquire_equel(rowcount = "rowcount")
- if (rowcount != 1)
- return(MR_NO_ID);
- while (exists) {
+ starting_value=value;
+ while(1) {
+ if (value > MAX_ID_VALUE) value = MIN_ID_VALUE;
+
+ sprintf(stmt_buf, "SELECT %s FROM %s WHERE %s=%d",
+ object, tablename, object, value);
+ EXEC SQL PREPARE inc_stmt FROM :stmt_buf;
+ EXEC SQL DECLARE inc_crs CURSOR FOR inc_stmt;
+ EXEC SQL OPEN inc_crs;
+ mr_sqlda->N = 1;
+ EXEC SQL DESCRIBE SELECT LIST FOR inc_stmt INTO mr_sqlda;
+ mr_sqlda->N = mr_sqlda->F;
+ mr_sqlda->V[0]=out_buf;
+ mr_sqlda->T[0]=97;
+ mr_sqlda->L[0]=255;
+ EXEC SQL FETCH inc_crs USING DESCRIPTOR mr_sqlda;
+
+ /* if we got an error from the FETCH, we have to preserve it or the
+ close will reset it and the caller with think nothing happened */
+ if(sqlca.sqlcode) errcode=sqlca.sqlcode;
+
+ EXEC SQL CLOSE inc_crs;
+ if (errcode < 0) return(MR_DBMS_ERR);
+ if (errcode == 1403) break;
+
value++;
- if (value > MAX_ID_VALUE)
- value = MIN_ID_VALUE;
-## retrieve (exists = any(tbl.name where tbl.name = value))
+ if (value == starting_value) return (MR_NO_ID);
}
- printf("setting ID %s to %d\n", name, value);
-## repeat replace v (#value = @value) where v.#name = @name
+ printf("setting ID %s to %d\n", object, value);
+ EXEC SQL UPDATE numvalues SET value = :value WHERE name = :object;
modified("values");
return(MR_SUCCESS);
-##}
-
-
-##generic_fix_id(table, idfield, txtfield, oldid, name)
-##char *table;
-##char *idfield;
-##char *txtfield;
-##int oldid;
-##char *name;
-##{
-## int rowcount, id;
-
- set_next_object_id(table, idfield);
-## retrieve (id = values.value) where values.#name = idfield
-## replace table (idfield = values.value) where values.#name = idfield and
-## table.idfield = oldid and table.txtfield = name
-## inquire_equel(rowcount = "rowcount")
+}
+
+
+generic_fix_id(tbl, idfield, txtfield, oldid, name)
+ EXEC SQL BEGIN DECLARE SECTION;
+ char *tbl;
+ char *idfield;
+ char *txtfield;
+ int oldid;
+ char *name;
+ EXEC SQL END DECLARE SECTION;
+{
+ EXEC SQL BEGIN DECLARE SECTION;
+ int rowcount, id;
+ EXEC SQL END DECLARE SECTION;
+
+ set_next_object_id(tbl, idfield);
+ EXEC SQL SELECT value INTO :id FROM numvalues
+ WHERE name = :idfield;
+ sprintf(stmt_buf,"UPDATE %s SET %s = %d WHERE %s=%d AND %s='%s'",
+ tbl,idfield,id,idfield,oldid,txtfield,name);
+ EXEC SQL EXECUTE IMMEDIATE :stmt_buf;
+ rowcount = sqlca.sqlerrd[2];
if (rowcount == 1)
printf("Fixed\n");
else
printf("Not fixed, rowcount = %d\n", rowcount);
- modified(table);
+ modified(tbl);
return(id);
-##}
+}