|
|
BSD 4.3
# include <ingres.h>
# include <aux.h>
# include <catalog.h>
# include <tree.h>
# include <symbol.h>
# include <access.h>
# include <func.h>
# include <pv.h>
# include <sccs.h>
# include <errors.h>
SCCSID(@(#)display.c 8.3 2/8/85)
/*
** DISPLAY -- display query corresponding to view, permission,
** or intgerity declaration
*/
extern short tTdbu[];
extern int display();
extern int null_fn();
struct fn_def DsplayFn =
{
"DISPLAY",
display,
null_fn,
null_fn,
NULL,
0,
tTdbu,
100,
'Z',
0
};
/*
** DISPLAY -- display query
**
** Parameters:
** pc -- number of args in pv
** pv -- pv[i] == 4 for VIEW, 5 for PERMIT, 6 for INTEGRITY
** where i % 2 == 0
** pv[i] -- relation names for which pv[i-1] is mode
** where i%2==1
**
** Returns:
** 0 -- total success
** err -- error number of last error
**
** Side Effects:
** prints out definition of appropriate characteristic of relation
**
** Trace Flags:
** 33, -1
*/
display(pc, pv)
int pc;
PARM pv[];
{
register int ac;
register PARM *av;
extern DESC Treedes;
register int i;
int err;
char err_array[PV_MAXPC];
auto int mode;
# ifdef xZTR1
if (tTf(50, -1))
{
printf("display: ");
prvect(pc, pv);
}
# endif
err = 0;
if (pc % 2 != 0)
syserr("display: bad param count %d", pc);
opencatalog("tree", OR_READ);
for (ac = 0, av = pv; ac < pc; av++, ac++)
{
mode = atoi(av->pv_val.pv_str);
av++;
err_array[ac++] = 0;
err_array[ac] = disp(av->pv_val.pv_str, mode);
}
for (ac = 0, av = pv; ac < pc; av++, ac++)
{
if (err_array[ac])
err = error(DISPERRBASE + err_array[ac], (av->pv_val).pv_str, 0);
}
return (err);
}
/*
** DISP -- display integrity, permit, or define query on a relation
**
** Finds a relation owned by the user or the DBA and passes
** the name and owner to the appropritae routine depending on
** mode.
**
** Parameters:
** relation -- relation on which query is to be printed
** mode -- the print mode:
** 4 -- view
** 5 -- permit
** 6 -- integrity
**
** Returns:
** 0 -- success
** 1 -- no such relation, or none seeable by the user.
** 3 -- VIEW mode and relation not a view
** 4 -- PERMIT and no permissions on relation
** 5 -- INTEGRITY mode and no integrity constraints
**
** Trace Flags:
** 33, 8
*/
disp(relation, mode)
char *relation;
int mode;
{
DESC d;
register int i;
extern char *Resrel;
# ifdef xZTR1
if (tTf(50, 8))
printf("disp: relation %s\n", relation);
# endif
Resrel = relation;
i = openr(&d, OR_RELTID, relation);
if (i > 0)
return (1);
else if (i < 0)
syserr("disp: openr(%s) ret %d", relation, i);
switch (mode)
{
case 4: /* View query */
if (d.reldum.relstat & S_VIEW)
pr_def(relation, d.reldum.relowner);
else
return (3);
break;
case 5:
if (pr_prot(relation, &d))
return (4);
break;
case 6:
if (d.reldum.relstat & S_INTEG)
pr_integrity(relation, d.reldum.relowner);
else
return (5);
break;
default:
syserr("disp: mode == %d", mode);
}
return (0);
}
/*
** PR_DEF -- Print "define view" query of a view
**
** Parameters:
** relation -- relation in question
** owner -- relowner
**
** Returns:
** none
**
** Side Effects:
** reads a tree, clears range table
**
** Trace Flags:
** 33, 9
*/
pr_def(relation, owner)
char *relation;
char *owner;
{
register QTREE *t;
QTREE *gettree();
# ifdef xZTR1
if (tTf(50, 9))
printf("pr_def(relation=\"%s\", owner=%s)\n", relation, owner);
# endif
printf("View %s defined:\n\n", relation);
clrrange();
/* Treeid == 0 because views have only one definition */
t = gettree(relation, owner, mdVIEW, 0,FALSE);
pr_range();
printf("define view ");
pr_tree(t);
}
/*
** PR_INTEGRITY -- print out integrity constraints on a relation
**
** Finds all integrity tuples for this unique relation, and
** calls pr_int() to print a query from them.
**
** Parameters:
** relid -- rel name
** relowner -- 2 byte owner id
**
** Returns:
** none
**
** Side Effects:
** file activity, query printing
**
** Trace Flags:
** 33, 9
*/
pr_integrity(relid, relowner)
char *relid;
char *relowner;
{
extern DESC Intdes;
TID hitid, lotid;
struct integrity key, tuple;
register int i;
# ifdef xZTR1
if (tTf(50, 9))
printf("pr_integrity(relid =%s, relowner=%s)\n",
relid, relowner);
# endif
printf("Integrity constraints on %s are:\n\n", relid);
opencatalog("integrities", OR_READ);
/* get integrities tuples for relid, relowner */
clearkeys(&Intdes);
setkey(&Intdes, &key, relid, INTRELID);
setkey(&Intdes, &key, relowner, INTRELOWNER);
if (i = find(&Intdes, EXACTKEY, &lotid, &hitid, &key))
syserr("pr_integrity: find %d", i);
for ( ; ; )
{
if (i = get(&Intdes, &lotid, &hitid, &tuple, TRUE))
break;
if (kcompare(&Intdes, &tuple, &key) == 0)
pr_int(&tuple, relid);
}
if (i != 1)
syserr("pr_integrity: get %d", i);
}
/*
** PR_INT -- print an integrity definition given a integrities tuple
**
** Parameters:
** i -- integrity tuple
**
** Returns:
** none
**
** Side Effects:
** prints a query
** reads a tree
*/
pr_int(i, relid)
register struct integrity *i;
char *relid;
{
register QTREE *t;
QTREE *gettree();
clrrange();
t = gettree(i->intrelid, i->intrelowner, mdINTEG, i->inttree);
printf("Integrity constraint %d -\n\n", i->inttree);
pr_range();
printf("define integrity on ");
pr_rv(Qt.qt_resvar = i->intresvar);
printf(" is ");
pr_qual(t->right);
printf("\n\n\n");
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.