]> andersk Git - moira.git/blobdiff - dbck/fix.dc
DBMS=ORACLE
[moira.git] / dbck / fix.dc
index 6a05e78f8fd248cf9c61285f59a4d6125c03c471..4c134eee818bc83630074b97540b0df698c200c7 100644 (file)
 #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)
@@ -55,20 +68,26 @@ int id;
 }
 
 
-##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)
@@ -112,7 +131,9 @@ int prompt(msg)
 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);
@@ -125,14 +146,13 @@ char *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);
                }
            }
@@ -152,57 +172,82 @@ char *msg;
  **
  **/
 
-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);
-##}
+}
This page took 0.256547 seconds and 4 git commands to generate.