Annotation of 42BSD/ingres/source/support/purge.c, revision 1.1

1.1     ! root        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     7.4     7/7/83)
        !            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: 
        !           110: #ifndef DIRBLKSIZ
        !           111: typedef        DIR     FILE;
        !           112: #endif
        !           113: extern DIR *opendir();
        !           114: extern struct direct *readdir();
        !           115: 
        !           116: 
        !           117: purgedb(db)
        !           118: register char  *db;
        !           119: {
        !           120:        struct relation         rel, key;
        !           121:        TID                     rtid, rlimtid;
        !           122:        register int            i;
        !           123:        register char           c;
        !           124:        long                    l;
        !           125:        DIR                     *dirp;
        !           126:        struct direct           *dp;
        !           127:        int                     darg[3];
        !           128:        PARM                    pv[2];
        !           129:        char                    pbuff[MAXNAME + 1];
        !           130:        char                    *fname;
        !           131: #ifndef DIRBLKSIZ
        !           132:        char                    fnambuf[DIRSIZ + 1];
        !           133: #endif
        !           134: 
        !           135: #      ifdef   xTTR2
        !           136:        tTfp(11, 0, "entered purgedb(%s)\n", db);
        !           137: #      endif
        !           138:        printf("Database %s", db);
        !           139:        if (!ask("? "))
        !           140:                return;
        !           141:        if (!Ask)
        !           142:                printf(":\n");
        !           143:        acc_init();
        !           144: 
        !           145:        /* set exclusive lock on data base */
        !           146: #      ifdef   xTTR2
        !           147:        tTfp(11, 1, "calling db_lock(%d)\n", M_EXCL);
        !           148: #      endif
        !           149:        db_lock(M_EXCL);
        !           150: 
        !           151:        /* open the relation relation for read-write */
        !           152:        opencatalog("relation", 2);
        !           153: 
        !           154:        if (find(&Reldes, NOKEY, &rtid, &rlimtid))
        !           155:        {
        !           156:                printf("\tcannot find in %s\n", db);
        !           157:                closecatalog(TRUE);     /* really close cache */
        !           158:                unldb();                /* unlock the database */
        !           159:                acc_close();
        !           160:                return;
        !           161:        }
        !           162: 
        !           163:        while (get(&Reldes, &rtid, &rlimtid, &rel, 1) == 0)
        !           164:        {
        !           165:                i = 0;
        !           166: 
        !           167:                /* check for temp rel */
        !           168:                if (bequal(rel.relid, "_SYS", 4))
        !           169:                {
        !           170:                        printf("\t%.14s: temporary", rel.relid);
        !           171:                        i++;
        !           172:                }
        !           173:                else if (rel.relsave < Today && rel.relsave != 0)
        !           174:                {
        !           175:                        printf("\t%.14s: expired", rel.relid);
        !           176:                        if (Purge)
        !           177:                                if (ask("\n\t\tPURGE? "))
        !           178:                                        i++;
        !           179:                }
        !           180:                else
        !           181:                        i = -1;
        !           182: 
        !           183:                /* if this relation should be purged -- call (local) destroy */
        !           184:                if (i > 0)
        !           185:                {
        !           186:                        char    *usave;
        !           187:                        printf("\tpurging\n");
        !           188: 
        !           189:                        /* allow DBA to purge other users relations */
        !           190:                        usave = 0;
        !           191:                        if (!bequal(rel.relowner, Usercode, 2)) {
        !           192:                                usave = Usercode;
        !           193:                                Usercode = rel.relowner;
        !           194:                        }
        !           195: 
        !           196:                        /* set up parameter vector for destroy */
        !           197:                        bmove(rel.relid, pbuff, MAXNAME);
        !           198:                        pbuff[MAXNAME] = '\0';
        !           199:                        pv[0].pv_type = PV_STR;
        !           200:                        pv[0].pv_val.pv_str = pbuff;
        !           201:                        pv[1].pv_type = PV_EOF;
        !           202:                        pv[1].pv_val.pv_str = NULL;
        !           203:                        if (destroy(1, pv) != 0)
        !           204:                                syserr("cannot destroy %s\n", pbuff);
        !           205:                        if (usave)
        !           206:                                Usercode = usave;
        !           207:                        closecatalog(FALSE);    /* to flush */
        !           208:                }
        !           209:                else if (i == 0)
        !           210:                        printf("\t\t(not purged)\n");
        !           211:        }
        !           212: 
        !           213:        /* open the directory to check for extra files */
        !           214:        if ((dirp = opendir(".")) == NULL)
        !           215:        {
        !           216:                printf("\tcannot open .\n");
        !           217:                closecatalog(TRUE);             /* really */
        !           218:                unldb();                /* unlock the database */
        !           219:                acc_close();
        !           220:                return;
        !           221:        }
        !           222: 
        !           223:        /* scan the directory */
        !           224:        for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) {
        !           225: 
        !           226: #ifdef DIRBLKSIZ
        !           227:                fname = dp->d_name;
        !           228:                if (dp->d_namlen <= 2)
        !           229:                        continue;
        !           230: #else DIRBLKSIZ
        !           231:                strncpy(fnambuf, dp->d_name, DIRSIZ);
        !           232:                fnambuf[DIRSIZ] = '\0';
        !           233:                fname = fnambuf;
        !           234:                if (!strcmp(fname, ".") || !strcmp(fname, ".."))
        !           235:                        continue;
        !           236: #endif DIRBLKSIZ
        !           237: 
        !           238:                /* throw out legitimate files */
        !           239:                if (sequal(fname, "admin"))
        !           240:                        continue;
        !           241: 
        !           242:                /* always purge _SYS files */
        !           243:                if (!bequal(fname, "_SYS", 4))
        !           244:                {
        !           245:                        if (fname[13] != 0)
        !           246:                        {
        !           247:                                /* it might be a relation */
        !           248:                                clearkeys(&Reldes);
        !           249:                                setkey(&Reldes, &key, fname, RELID);
        !           250:                                setkey(&Reldes, &key, &fname[MAXNAME], RELOWNER);
        !           251:                                if (getequal(&Reldes, &key, &rel, &rtid) <= 0)
        !           252:                                {
        !           253:                                        /* it is a relation (or should be saved) */
        !           254:                                        continue;
        !           255:                                }
        !           256:                        }
        !           257: 
        !           258:                        /* it is a funny file!!! */
        !           259:                        if (!Clean)
        !           260:                        {
        !           261:                                printf("\t%s: file (not unlinked)\n", fname);
        !           262:                                continue;
        !           263:                        }
        !           264:                }
        !           265: 
        !           266:                /* purge the file */
        !           267:                printf("\tunlinking %s\n", fname);
        !           268:                if (unlink(fname))
        !           269:                        printf("\tcannot unlink\n");
        !           270:        }
        !           271:        closecatalog(TRUE);     /* close catalogs */
        !           272:        unldb();                /* unlock the database */
        !           273:        acc_close();
        !           274:        closedir(dirp);
        !           275: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.