4.1cBSD/usr/src/ucb/ingres/source/dbu/print.c

Compare this file to the similar file:
Show the results in this format:

# include	<pv.h>
# include	<ingres.h>
# include	<access.h>
# include	<aux.h>
# include	<lock.h>
# include 	<func.h>
# include	<sccs.h>

SCCSID(@(#)print.c	7.1	2/5/81)

extern	short	tTdbu[];
extern	int	print();
extern	int	null_fn();

struct fn_def PrintFn =
{
	"PRINT",
	print,
	null_fn,		/* initialization function */
	null_fn,
	NULL,
	0,
	tTdbu,
	100,
	'Z',
	0
};




/*
**  PRINT -- print relation
**
**	Parameters:
**		parmv[0] through parmv[parmc -2] contain names
**		of relations to be printed on the standard output.
**		Note that this calls printatt, so all the output formatting 
**		features associated with printatt are available here.
**
**		parmv[parmc - 1].pv_type is PV_INT for other than a "normal"
**		print.  In this case parmv[parmc - 1] is 0 for headers on
**		every page, and 1 for all headers and footers suppressed.
**		err_array is set to 0 for a good relation, 1 for no
**		relation by that name, and -1 for a view.
**
**	Returns:
**		0 if no errors else the last error number
**
**	Trace Flags:
**		40
*/

print(parmc, parmv)
int	parmc;
PARM	parmv[];
{
	DESC			d;
	extern DESC		Attdes;
	struct attribute	att, katt;
	char			tuple[MAXTUP];
	TID			tid, limtid;
	TID			stid;
	register int		i;
	register int		ern;
	register char		*name;
	extern struct out_arg	Out_arg;
	int			mode;
	int			lineno;
	int			pc;
	int			err_array[PV_MAXPC];

#	ifdef xZTR1
	if (tTf(40, -1))
	{
		printf("entering print\n");
		prvect(parmc, parmv);
	}
#	endif

	if (parmv[parmc - 1].pv_type == PV_INT)
		mode = parmv[parmc - 1].pv_val.pv_int;
	else
		mode = -1;

	opencatalog("attribute", 0);

	for (pc = 0; pc <= parmc - 1; pc++)
	{
		name = parmv[pc].pv_val.pv_str;

		ern = openr(&d, 0, name);
		if (ern == AMOPNVIEW_ERR)
		{
			err_array[pc] = 5002;	/* can't print a view */
			continue;
		}
		if (ern > 0)
		{	
			err_array[pc] = 5001;	/* cannot open relation */
			continue;
		}
		if (ern < 0)
			syserr("printr:openr target %s, %d",
			name, ern);
		if ((d.reldum.relstat & S_PROTALL) && (d.reldum.relstat & S_PROTRET) &&
			!bequal(Usercode, d.reldum.relowner, 2))
		{
			err_array[pc] = 5003;	/* protection violation */
			closer(&d);
			continue;
		}


		/* a printable relation */
		err_array[pc] = 0;
#		ifdef xZTR2
		if (tTf(40, 1))
			printdesc(&d);
#		endif
		lineno = Out_arg.linesperpage - 6;
		if (mode <= 0)
		{
			if (mode == 0)
				putchar('\014');	/* form feed */
			printf("\n%s relation\n", name);
			lineno -= 2;
		}
	
		find(&d, NOKEY, &tid, &limtid);
	
		if (Lockrel)
			setrll(A_SLP, d.reltid.ltid, M_SHARE);	/* set shared lock on relation*/
		for (;;)
		{
			if (mode <= 0)
			{
				beginhdr();
				seq_init(&Attdes, &d);
				for (i = 1; seq_attributes(&Attdes, &d, &att); i++)
				{
					printhdr(d.relfrmt[i], d.relfrml[i], att.attname);
				}
				printeol();
				printeh();
				lineno -= 3;
			}
	
#			ifdef xZTM
			if(tTf(99, 1))
				timtrace(29, 0);
#			endif
			while ((ern = get(&d, &tid, &limtid, tuple, TRUE)) == 0)
			{
				printup(&d, tuple);

				if (mode == 0 && --lineno <= 0)
				{
					printf("\n\n\n\n\n\n");
					lineno = Out_arg.linesperpage - 6;
					break;
				}
			}
#			ifdef xZTM
			if(tTf(99, 1))
				timtrace(30, 0);
#			endif
			if (ern > 0)
				break;
	
			if (ern < 0)
				syserr("print: get %d", ern);
		}
	
		if (mode <= 0)
			printeh();
		if (Lockrel)
			unlrl(d.reltid.ltid);	/* release relation lock */
	
		closer(&d);
	}
	/* check for any error messages that should be printed */
	ern = 0;
	for (pc = 0; pc <= parmc - 1; pc++)
	{
		if (i = err_array[pc])
		{
			ern = nferror(i, parmv[pc].pv_val.pv_str, 0);
		}
	}
	return (ern);
}