This commit is contained in:
Oliver Lehmann 1989-04-04 09:26:31 +00:00
parent 9f30ec29eb
commit 6d2490fb13
2 changed files with 522 additions and 0 deletions

View File

@ -0,0 +1,242 @@
# include <stdio.h>
# include "gen.h"
# include "../h/dbs.h"
# include "../h/aux.h"
# include "../h/access.h"
# include "../h/lock.h"
# include "../h/bs.h"
# ifdef P8000
ret_buf AAjmp_buf;
# else
jmp_buf AAjmp_buf;
# endif
FILE *Dbs_out = stdout;
extern int AAdbstat;
main(argc, argv)
int argc;
char *argv[];
{
register char **av;
register char *q;
register char *p;
register int i;
register int badf;
register int mode;
register int nc;
char style;
char stdbuf[BUFSIZ];
extern struct out_arg AAout_arg;
extern char *Parmvect[];
extern char *Flagvect[];
extern char *AAdbpath;
extern char *AAproc_name;
AAproc_name = "PRINTR";
# ifdef xSTR1
AAtTrace(&argc, argv, 'X');
# endif
mode = -1;
badf = 0;
/*
** Scan the argument vector and otherwise initialize.
*/
switch (i = initucode(argc, argv, TRUE, (char *) 0, M_SHARE))
{
case 0:
case 5:
break;
case 1:
case 6:
AAsyserr(0, "Die Datenbank '%s' existiert nicht", Parmvect[0]);
case 2:
AAsyserr(0, "Sie duerfen auf die Datenbank '%s' nicht zugreifen", Parmvect[0]);
case 3:
AAsyserr(0, "Sie sind kein eingetragener DBS-Nutzer");
case 4:
printf("Sie haben keinen Datenbanknamen angegeben\n");
badf++;
break;
default:
AAsyserr(22200, AAproc_name, i);
}
for (av = Flagvect; p = *av; av++)
{
if (p[0] != '-')
goto badflag;
switch (p[1])
{
case 'H':
case 'h': /* do headers on each page */
mode = -2;
if (!p[2])
break;
if (AA_atoi(&p[2], &AAout_arg.linesperpage))
goto badflag;
break;
case 'S':
case 's': /* supress headers and footers */
mode = -3;
if (p[2])
goto badflag;
break;
case 'C':
case 'c': /* set cNwidth */
if (AA_atoi(&p[2], &AAout_arg.c0width))
{
badflag:
printf("Unbekanntes Flag '%s'\n", p);
badf++;
continue;
}
break;
case 'I':
case 'i': /* set iNwidth */
switch (p[2])
{
case '1':
if (AA_atoi(&p[3], &AAout_arg.i1width))
goto badflag;
break;
case '2':
if (AA_atoi(&p[3], &AAout_arg.i2width))
goto badflag;
break;
case '4':
if (AA_atoi(&p[3], &AAout_arg.i4width))
goto badflag;
break;
default:
goto badflag;
}
break;
case 'F':
case 'f': /* set fNwidth */
style = p[3];
switch (style)
{
case 'E':
case 'e':
case 'F':
case 'f':
case 'G':
case 'g':
case 'N':
case 'n':
break;
default:
goto badflag;
}
for (q = &p[4]; *q != '.'; q++)
if (!*q)
goto badflag;
*q++ = 0;
switch (p[2])
{
case '4':
# ifndef NO_F4
if (AA_atoi(&p[4], &AAout_arg.f4width))
goto badflag;
if (AA_atoi(q, &AAout_arg.f4prec))
goto badflag;
AAout_arg.f4style = style;
break;
# endif
case '8':
if (AA_atoi(&p[4], &AAout_arg.f8width))
goto badflag;
if (AA_atoi(q, &AAout_arg.f8prec))
goto badflag;
AAout_arg.f8style = style;
break;
default:
goto badflag;
}
break;
case 'V':
case 'v':
if (!p[2] || p[3])
goto badflag;
AAout_arg.coldelim = p[2];
break;
case 'L':
case 'l':
if (!p[2] || p[3])
goto badflag;
AAout_arg.linedelim = p[2];
break;
default:
goto badflag;
}
}
/*
** Find end of Parmvect and store mode there
*/
for (nc = 1; Parmvect[nc]; nc++)
continue;
Parmvect[nc] = (char *) mode;
/*
** Check for usage errors.
*/
if (nc < 2)
{
badf++;
printf("HINWEIS: printr [flags] db_name {relation}\n");
}
if (badf)
{
AAunlall();
fflush(stdout);
exit(-1);
}
p = Parmvect[0]; /* data base is first parameter */
if (chdir(AAdbpath) < 0)
AAsyserr(22201, AAproc_name, p);
# ifdef SETBUF
setbuf(stdout, stdbuf);
# endif
/* initialize access methods (and AAdmin struct) for user_ovrd test */
AAam_start();
print(nc - 1, &Parmvect[1]);
AAunldb();
fflush(stdout);
exit(0);
}
rubproc()
{
AAunlall();
fflush(stdout);
exit(-1);
}

View File

@ -0,0 +1,280 @@
# include <stdio.h>
# include "gen.h"
# include "../h/dbs.h"
# include "../h/aux.h"
# include "../h/lock.h"
# include "../h/bs.h"
# ifdef P8000
ret_buf AAjmp_buf;
# else
jmp_buf AAjmp_buf;
# endif
char All;
char Superuser;
char Ask;
char Purge;
char Clean;
extern int Wait_action;
extern int AAdbstat;
extern char *AAusercode;
long Today;
char SYSNAME[] = "_SYS";
int s_SYSNAME = sizeof SYSNAME - 1;
extern DESC Reldes;
struct directory
{
short inumber;
char fname[14];
char null;
};
/*
** PURGE DATABASE
**
** This stand-alone routine cleans up a database. This includes:
**
** - Destroy temporary relations, i.e., relations with names
** beginning with SYSNAME.
** - Destroy expired relations
** - Clean out junk files, such as core, etc.
** - As a suggested future expansion, reformat relations which
** have many overflow pages, or heaps with lots of old
** deleted tuples, etc.
**
** It may be called by the DBS superuser or by the dba of
** a database. There are two modes. The first is where databases
** to be purged are explicitly named. If none are named, then
** all databases owned by the particular user (or all databases
** if the DBS superuser) are purged.
**
** Flags:
** -p enable the purge feature, i.e., clean out expired
** relations as well as temporary relations.
** -s attempt to run in superuser mode. The user must be
** login USERDBS for this to succeed.
** -a ask the user before each database.
** -f clean out rather than report junk files.
*/
main(argc, argv)
int argc;
char *argv[];
{
register char *db;
register int ret;
extern char *getnxtdb();
# ifdef xSTR1
AAtTrace(&argc, argv, 'X');
# endif
/* set up arguments and operating modes */
initialize(argc, argv);
time(&Today);
# ifdef xSTR2
AAtTfp(10, 2, "AAusercode: %.2s\n", AAusercode);
# endif
ret = 0;
while (db = getnxtdb())
ret += purgedb(db);
fflush(stdout);
exit(ret);
}
rubproc()
{
AAunlall();
fflush(stdout);
exit(-1);
}
/*
** PURGE DATABASE
**
** The database is purged of temporaries, expired relations, and
** junk.
*/
purgedb(db)
register char *db;
{
struct relation rel;
struct relation key;
struct tup_id rtid;
struct tup_id rlimtid;
register int i;
# ifdef NON_V7_FS
extern char *read_dir();
register char *direc;
# else
struct directory direc;
register int fd;
extern long lseek();
# endif
int ret;
char *pv[2];
char pbuff[MAXNAME + 3];
ret = 0;
# ifdef xSTR2
AAtTfp(11, 0, "entered purgedb(%s)\n", db);
# endif
printf("Datenbank %s\n", db);
AAam_start();
/* set exclusive lock on data base */
# ifdef xSTR2
AAtTfp(11, 1, "calling db_lock(%d)\n", M_EXCL);
# endif
db_lock(M_EXCL);
/* open the relation relation for read-write */
opencatalog(AA_REL, 2);
if (AAam_find(&Reldes, NOKEY, &rtid, &rlimtid))
{
printf("Datenbank %s: Fehler beim Eroeffnen des Katalogs \"relation\"\n", db);
ret++;
goto go_away;
}
while (!AAam_get(&Reldes, &rtid, &rlimtid, &rel, 1))
{
i = 0;
/* check for temp rel */
if (AAbequal(rel.relid, SYSNAME, s_SYSNAME))
i++;
/* check for expired */
else if (rel.relsave < Today && rel.relsave)
{
printf("**\t\tRelation %.14s: verfallen\n", rel.relid);
if (Purge)
if (ask("Relation loeschen"))
i++;
}
/* if this relation should be purged -- call destroy */
if (i)
{
printf("**\t\t purging %.14s\n", rel.relid);
/* set up parameter vector for destroy */
AAbmove(rel.relid, pbuff, MAXNAME + 2);
pbuff[MAXNAME + 2] = '\0';
pv[0] = pbuff;
pv[1] = (char *) -1;
if (destroy(1, pv))
AAsyserr(21079, pv[0]);
closecatalog(FALSE); /* to flush */
}
}
/* open the directory to check for extra files */
# ifdef NON_V7_FS
if (!open_dir("."))
{
printf("Fehler beim Eroeffnen des directory %s/.\n");
ret++;
goto go_away;
}
/* scan the directory */
while (direc = read_dir())
{
/* throw out legitimate files */
if (AAsequal(direc, ".") || AAsequal(direc, "..") || AAsequal(direc, AA_ADMIN))
continue;
/* always purge SYSNAME files */
if (!AAbequal(direc, SYSNAME, s_SYSNAME))
{
/* it might be a relation */
AAam_clearkeys(&Reldes);
AAam_setkey(&Reldes, &key, direc, RELID);
AAam_setkey(&Reldes, &key, &direc[MAXNAME], RELOWNER);
if (AAgetequal(&Reldes, &key, &rel, &rtid) <= 0)
{
/* it is a relation (or should be saved) */
continue;
}
/* it is a funny file!!! */
printf("**\t\tfile\t %s\n", direc);
if (!Clean)
continue;
}
/* purge the file */
if (ask("file loeschen") && unlink(direc))
printf("**\t\tFehler beim Loeschen des file %s\n", direc);
}
close_dir();
# else
if ((fd = open(".", 0)) < 0)
{
printf("Fehler beim Eroeffnen des directory %s/.\n");
ret++;
goto go_away;
}
direc.null = 0;
lseek(fd, 32L, 0);
/* scan the directory */
while (read(fd, &direc, 16) == 16)
{
/* throw out null entries */
if (!direc.inumber)
continue;
/* throw out legitimate files */
if (AAsequal(direc.fname, AA_ADMIN))
continue;
/* always purge SYSNAME files */
if (!AAbequal(direc.fname, SYSNAME, s_SYSNAME))
{
if (direc.fname[13])
{
# ifdef VENIX
AAbmove(direc.fname, pbuff, MAXNAME + 3);
for (i = 0; i < MAXNAME + 2; i++)
if (direc.fname[i] == '#')
direc.fname[i] = ' ';
# endif
/* it might be a relation */
AAam_clearkeys(&Reldes);
AAam_setkey(&Reldes, &key, direc.fname, RELID);
AAam_setkey(&Reldes, &key, &direc.fname[MAXNAME], RELOWNER);
if (AAgetequal(&Reldes, &key, &rel, &rtid) <= 0)
/* it is a relation (or should be saved) */
continue;
# ifdef VENIX
AAbmove(pbuff, direc.fname, MAXNAME + 3);
# endif
}
/* it is a funny file!!! */
printf("**\t\tfile\t %s\n", direc.fname);
if (!Clean)
continue;
}
/* purge the file */
if (ask("file loeschen") && unlink(direc.fname))
printf("**\t\tFehler beim Loeschen des file %s\n",
direc.fname);
}
close(fd);
# endif
go_away:
closecatalog(TRUE); /* close catalogs */
AAunlall(); /* unlock the database */
AAam_exit();
return (ret);
}