1: # include   <stdio.h>
   2: # include   <ingres.h>
   3: # include   <aux.h>
   4: # include   <lock.h>
   5: # include   <pv.h>
   6: # include   <sccs.h>
   7: # include   <opsys.h>
   8: # include   <sys/dir.h>
   9: 
  10: SCCSID(@(#)purge.c	8.3	1/31/86)
  11: 
  12: /*
  13: **  PURGE DATABASE
  14: **
  15: **	This stand-alone routine cleans up a database.  This includes:
  16: **
  17: **	- Destroy temporary relations, i.e., relations with names
  18: **		beginning with "_SYS".
  19: **	- Destroy expired relations
  20: **	- Clean out junk files, such as core, etc.
  21: **	- As a suggested future expansion, reformat relations which
  22: **		have many overflow pages, or heaps with lots of old
  23: **		deleted tuples, etc.
  24: **
  25: **	It may be called by the ingres superuser or by the dba of
  26: **	a database.  There are two modes.  The first is where databases
  27: **	to be purged are explicitly named.  If none are named, then
  28: **	all databases owned by the particular user (or all databases
  29: **	if the INGRES superuser) are purged.
  30: **
  31: **	Flags:
  32: **	-p	enable the purge feature, i.e., clean out expired
  33: **		relations as well as temporary relations.
  34: **	-s	attempt to run in superuser mode.  The user must be
  35: **		login "ingres" for this to succeed.
  36: **	-a	ask the user before each database.
  37: **	-f	clean out rather than report junk files.
  38: **
  39: **	(8/2/82 peter@lbl-unix)
  40: **		allow dba to destroy user relations by suitable manipulation
  41: **		of Usercode
  42: **		added ExitFn = nullfn() to avoid untimely aborts on syserrs.
  43: **	(5/13/83 peter@lbl-csam)
  44: **		folded in new directory rootines for 4.1c-bsd
  45: */
  46: 
  47: 
  48: char        All;
  49: char        Superuser;
  50: char        Ask;
  51: char        Purge;
  52: char        Clean;
  53: extern int  Wait_action;
  54: extern int  Status;
  55: extern char *Usercode;
  56: long        Today;
  57: short       tTdbu[100];
  58: extern int  (*ExitFn)();
  59: 
  60: main(argc, argv)
  61: int argc;
  62: char    *argv[];
  63: {
  64:     register char   *db;
  65:     register int    i;
  66:     char        fake[256];
  67:     extern char *getnxtdb();
  68:     extern int  null_fn();
  69: 
  70:     argv[argc] = NULL;
  71: #	ifdef xTTR1
  72:     tTrace(argv, 'T', tTdbu, 100);
  73: #	endif
  74: 
  75:     /* set up arguments and operating modes */
  76:     initialize(argc, argv);
  77:     time(&Today);
  78: #	ifdef xTTR2
  79:     tTfp(10, 2, "Usercode: %.2s\n", Usercode);
  80: #	endif
  81: 
  82:     /* Assign ExitFn so syserr (e.g. from destroy) does not cause aborts */
  83:     ExitFn = null_fn;
  84: 
  85:     while (db = getnxtdb())
  86:     {
  87:         purgedb(db);
  88:     }
  89:     printf("\npurge completed\n");
  90: }
  91: 
  92: 
  93: rubproc()
  94: {
  95:     unldb();
  96:     exit(-1);
  97: }
  98: 
  99: 
 100: 
 101: /*
 102: **  PURGE DATABASE
 103: **
 104: **	The database is purged of temporaries, expired relations, and
 105: **	junk.
 106: */
 107: 
 108: extern DESC Reldes;
 109: DESC        Btreesec;
 110: int     Btree_fd;
 111: char        *Fileset;
 112: 
 113: #ifndef rewinddir
 114: typedef DIR FILE;
 115: #endif
 116: extern DIR *opendir();
 117: extern struct direct *readdir();
 118: 
 119: 
 120: purgedb(db)
 121: register char   *db;
 122: {
 123:     struct relation     rel, key;
 124:     TID         rtid, rlimtid;
 125:     register int        i;
 126:     register char       c;
 127:     long            l;
 128:     DIR         *dirp;
 129:     struct direct       *dp;
 130:     int         darg[3];
 131:     PARM            pv[2];
 132:     char            pbuff[MAXNAME + 1];
 133:     char            *fname;
 134: #ifndef rewinddir
 135:     char            fnambuf[DIRSIZ + 1];
 136: #endif
 137: 
 138: #	ifdef xTTR2
 139:     tTfp(11, 0, "entered purgedb(%s)\n", db);
 140: #	endif
 141:     printf("Database %s", db);
 142:     if (!ask("? "))
 143:         return;
 144:     if (!Ask)
 145:         printf(":\n");
 146:     acc_init();
 147: 
 148:     /* set exclusive lock on data base */
 149: #	ifdef xTTR2
 150:     tTfp(11, 1, "calling db_lock(%d)\n", M_EXCL);
 151: #	endif
 152:     db_lock(M_EXCL);
 153: 
 154:     /* open the relation relation for read-write */
 155:     opencatalog("relation", OR_WRITE);
 156: 
 157:     if (find(&Reldes, NOKEY, &rtid, &rlimtid))
 158:     {
 159:         printf("\tcannot find in %s\n", db);
 160:         closecatalog(TRUE); /* really close cache */
 161:         unldb();        /* unlock the database */
 162:         acc_close();
 163:         return;
 164:     }
 165: 
 166:     while (get(&Reldes, &rtid, &rlimtid, &rel, 1) == 0)
 167:     {
 168:         i = 0;
 169: 
 170:         /* check for temp rel */
 171:         if (bequal(rel.relid, "_SYS", 4))
 172:         {
 173:             printf("\t%.14s: temporary", rel.relid);
 174:             i++;
 175:         }
 176:         else if (rel.relsave < Today && rel.relsave != 0)
 177:         {
 178:             printf("\t%.14s: expired", rel.relid);
 179:             if (Purge)
 180:                 if (ask("\n\t\tPURGE? "))
 181:                     i++;
 182:         }
 183:         else
 184:             i = -1;
 185: 
 186:         /* if this relation should be purged -- call (local) destroy */
 187:         if (i > 0)
 188:         {
 189:             char    *usave;
 190:             printf("\tpurging\n");
 191: 
 192:             /* allow DBA to purge other users relations */
 193:             usave = 0;
 194:             if (!bequal(rel.relowner, Usercode, 2)) {
 195:                 usave = Usercode;
 196:                 Usercode = rel.relowner;
 197:             }
 198: 
 199:             /* set up parameter vector for destroy */
 200:             bmove(rel.relid, pbuff, MAXNAME);
 201:             pbuff[MAXNAME] = '\0';
 202:             pv[0].pv_type = PV_STR;
 203:             pv[0].pv_val.pv_str = pbuff;
 204:             pv[1].pv_type = PV_EOF;
 205:             pv[1].pv_val.pv_str = NULL;
 206:             if (destroy(1, pv) != 0)
 207:                 syserr("cannot destroy %s\n", pbuff);
 208:             if (usave)
 209:                 Usercode = usave;
 210:             closecatalog(FALSE);    /* to flush */
 211:         }
 212:         else if (i == 0)
 213:             printf("\t\t(not purged)\n");
 214:     }
 215: 
 216:     /* open the directory to check for extra files */
 217:     if ((dirp = opendir(".")) == NULL)
 218:     {
 219:         printf("\tcannot open .\n");
 220:         closecatalog(TRUE);     /* really */
 221:         unldb();        /* unlock the database */
 222:         acc_close();
 223:         return;
 224:     }
 225: 
 226:     /* scan the directory */
 227:     for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) {
 228: 
 229: #ifdef rewinddir
 230:         fname = dp->d_name;
 231:         if (dp->d_namlen <= 2)
 232:             continue;
 233: #else rewinddir
 234:         strncpy(fnambuf, dp->d_name, DIRSIZ);
 235:         fnambuf[DIRSIZ] = '\0';
 236:         fname = fnambuf;
 237:         if (!strcmp(fname, ".") || !strcmp(fname, ".."))
 238:             continue;
 239: #endif rewinddir
 240: 
 241:         /* throw out legitimate files */
 242:         if (sequal(fname, "admin"))
 243:             continue;
 244: 
 245:         /* always purge _SYS files */
 246:         if (!bequal(fname, "_SYS", 4))
 247:         {
 248:             if (fname[13] != 0)
 249:             {
 250:                 /* it might be a relation */
 251:                 clearkeys(&Reldes);
 252:                 setkey(&Reldes, &key, fname, RELID);
 253:                 setkey(&Reldes, &key, &fname[MAXNAME], RELOWNER);
 254:                 if (getequal(&Reldes, &key, &rel, &rtid) <= 0)
 255:                 {
 256:                     /* it is a relation (or should be saved) */
 257:                     continue;
 258:                 }
 259:             }
 260: 
 261:             /* it is a funny file!!! */
 262:             if (!Clean)
 263:             {
 264:                 printf("\t%s: file (not unlinked)\n", fname);
 265:                 continue;
 266:             }
 267:         }
 268: 
 269:         /* purge the file */
 270:         printf("\tunlinking %s\n", fname);
 271:         if (unlink(fname))
 272:             printf("\tcannot unlink\n");
 273:     }
 274:     closecatalog(TRUE); /* close catalogs */
 275:     unldb();        /* unlock the database */
 276:     acc_close();
 277:     closedir(dirp);
 278: }

Defined functions

main defined in line 60; never used
purgedb defined in line 120; used 1 times
  • in line 87
rubproc defined in line 93; never used

Defined variables

All defined in line 48; never used
Ask defined in line 50; used 1 times
Btree_fd defined in line 110; never used
Clean defined in line 52; used 1 times
Fileset defined in line 111; never used
Purge defined in line 51; used 1 times
Superuser defined in line 49; never used
Today defined in line 56; used 2 times
tTdbu defined in line 57; used 1 times
  • in line 72
Last modified: 1986-04-17
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1675
Valid CSS Valid XHTML 1.0 Strict