2.11BSD/ingres/source/support/copydb.q

# include	<stdio.h>

# define	MAXNAME	13	/* one more for the null */
# define	MAXKEYS	6	/* changing this is insuficient */
# define	MAXINDEX 10	/* change as needed */
# define	MAXREL	1000	/* can be increased as needed */
# define	MAXDOM 	50
# define	INT	30
# define	FLOAT	31
# define	CHAR	32

##char	Usercode[3];		/* two char  usercode plus null */
char	**Wanted;
int	Status;

FILE	*Ifile, *Ofile;

struct relation
{
	char	name[MAXNAME];
	char	indx;
	int	spec;
	int	atts;
};

struct attribute
{
	char	aname[MAXNAME];
	char	format;
	char	length;
};

struct index
{
	char	iname[MAXNAME];
	char	ispec;
	char	idom[MAXKEYS];
};


main(argc,argv)
int	argc;
char	**argv;
{

##	char	*db;
	char	*path;
##	char	name[MAXNAME];
##	int	indx;
##	int	atts;
##	int	spec;
##	char	iname[MAXNAME];
##	int	idomv1, idomv2, idomv3, idomv4, idomv5, idomv6;


##	int	n;

	register struct relation	*relptr;
	register struct attribute	*attptr;
	register int			i;
	struct relation			relations[MAXREL];
	struct attribute		attributes[MAXDOM], indatts[MAXKEYS];
	struct index			indexes[MAXINDEX];
	struct index			*indxptr;
	int				attxtra[MAXDOM], indattx[MAXKEYS];
	int				xcount;
	int				j;
	extern				*Exitfn, exitfn;
	char				line[100];
##	char				*uover;

	if (argc < 3)
		syserr(0,"wrong number of parameters");

	uover = 0;
	if (bequal(*++argv, "-u", 2))
		uover = *argv++;
	db = *argv++;
	path = *argv++;
	Wanted = argv++;

	if(path[0] != '/') {
		printf("Error: %s is not a full path name\n", path);
		exit(1);
	}

	if ((Ifile = fopen(ztack(path,"/copy.in"), "w")) == NULL)
		syserr(0,"Cannot create %s!",ztack(path,"/copy.in"));
	if ((Ofile = fopen(ztack(path,"/copy.out"), "w")) == NULL)
		syserr(0,"Cannot create %s!",ztack(path,"/copy.out"));

	Exitfn = &exitfn;



##	ingres	db uover

##	retrieve (Usercode = usercode)
##	{
		;
##	}

##	range of r is relation
	i = 0;

	/*
	**	Bring the relations into core
	*/
	relptr = relations;
##	retrieve (name = r.relid, spec = r.relspec, indx = r.relindxd,
##		atts = r.relatts)
##		where r.relowner = Usercode
##		and mod(r.relstat,2) != 1 /* sys catalog */
##		and r.relindxd >= 0
##		and r.relid != "_SYS*" /* system temporaries */
##	{
		if (notwanted(name))
			continue;
		if(i++>=MAXREL)
			syserr("Too many relations!!!");
		smove(name,&(relptr->name));
		relptr->spec = spec;
		relptr->indx = indx;
		relptr++->atts = atts;
##	}


	/*
	**	For each relation bring its attributes into core
	**	in domain order
	*/
##	range of a is attribute
##	range of i is indexes
	n = i;
	printf("%d relations found\n",n);
	for (relptr = relations; relptr < &relations[n]; relptr++)
	{
		writein("create ");
		writeout("copy ");
		smove(relptr->name,name);
		writeboth(name);
		writeboth("(\n\t");

		xcount = retatts(name,attributes,attxtra);
		for(i = 0; i < relptr->atts; i++)
		{
			attptr = &attributes[i];
			if(i)
				writeboth(",\n\t");
			writeboth(attptr->aname);
			putboth('=');
			switch(attptr->format)
			{

			  case INT:
				putboth('i');
				break;

			  case FLOAT:
				putboth('f');
				break;

			  case CHAR:
				putboth('c');
				break;

			  default:
				syserr("Bad type: %d, in %s of %s!!",
					attptr->format,attptr->aname,
					name);

			}
			writeboth(iocv(attptr->length & 0377));
		}

		writeboth("\n)");
		writeout(" into \"");
		writein("\n\\p\\g\ncopy ");
		writein(name);
		writein("() from \"");
		writeboth(path);
		putboth('/');
		writeboth(name);
		writeboth(Usercode);
		writeboth("\"\n\\p\\g\n");


		if (relptr->spec != 5 && relptr->spec != 0)
			modify(name,attributes,attxtra,relptr->spec,xcount);
		if (relptr->indx)
		{
			indxptr = indexes;
			i = 0;

##			retrieve (iname = i.irelidi, spec = i.irelspeci,
##				idomv1 = i.idom1, idomv2 = i.idom2, idomv3 = i.idom3,
##				idomv4 = i.idom4, idomv5 = i.idom5, idomv6 = i.idom6)
##			where i.irelidp = name and i.iownerp = Usercode
##			{

				if (i++ >= MAXINDEX)
					syserr("Too many indexes on %s!!",name);
				smove(iname,indxptr->iname);
				indxptr->ispec = spec;
				indxptr->idom[0] = idomv1;
				indxptr->idom[1] = idomv2;
				indxptr->idom[2] = idomv3;
				indxptr->idom[3] = idomv4;
				indxptr->idom[4] = idomv5;
				indxptr->idom[5] = idomv6;
				indxptr++;
##			}

			while (--indxptr >= indexes)
			{
	
				writein("index on ");
				writein(name);
				writein(" is ");
				writein(indxptr->iname);
				writein("(\n\t");
	
				for (i=0; indxptr->idom[i] && i < MAXKEYS; i++)
				{
					if(i)
						writein(",\n\t");
					writein(attributes[indxptr->idom[i]-1].aname);
				}
				writein(")\n\\p\\g\n");
				if(indxptr->ispec != 10 && indxptr->ispec != 11)
				{
					xcount = retatts(indxptr->iname,indatts,indattx);
					modify(indxptr->iname,indatts,indattx,indxptr->ispec,xcount);
				}
			}
		}
	}
	fflush(Ifile);
	fflush(Ofile);
	printf("All done!\n\n");
}
exitfn()
{
	fflush(Ifile);
	fflush(Ofile);
	exit(-1);
}


modify(name, attributes, attxtra, spec, xcount)
char	*name;
struct attribute	*attributes;
int	*attxtra;
int	spec;
int	xcount;
{
	register	i,j;
	writein("modify ");
	writein(name);
	writein(" to ");
	switch(spec)
	{

	  case -5:
		writein("cheap");
		goto nokeys;

	  case -10:
	  case -11:
		writein("c");
	  case 10:
	  case 11:
		writein("isam on ");
		break;

	  case -20:
	  case -21:
		writein("c");
	  case 21:
	  case 20:
		writein("hash on ");
		break;

	  default:
		syserr("Unimplimented spec: %d on %s",
			spec,name);

	}
	j = 0;
	for (i = 1; i <= xcount; i++)
	{
		if(j++)
			writein(",\n\t");
		writein(attributes[attxtra[i]].aname);
	}
	if (!j)
		syserr("No keys found for %s!!!",name);
nokeys:
	writein("\n\\p\\g\n");
}
retatts(name,attributes,attxtra)
char	*name;
struct attribute	*attributes;
int	attxtra[];
{
	register	xcount, i;
	register struct attribute	*attptr;

##	char	aname[MAXNAME];
##	int	domain, format, length, extra;
	i = xcount = 0;
##	retrieve (aname = a.attname,domain = a.attid, format = a.attfrmt,
##		 length = a.attfrml, extra = a.attxtra)
##
##	where a.attrelid = name and a.attowner = Usercode
##	{
		if (i++ >= MAXDOM)
			syserr("Too many attributes!!!");
		attptr = &attributes[domain-1];
		smove(aname,attptr->aname);
		attptr->format = format;
		attptr->length = length;
		if(extra)
		{
			attxtra[extra] = domain - 1;
			xcount++;
		}
##	}
	return(xcount);
}


writeboth(string)
char	*string;
{
	register char	*sp;

	sp = string;

	while(*sp)
	{
		putc(*sp, Ofile);
		putc(*sp++, Ifile);
	}
}

putboth(ch)
char	ch;
{
	putc(ch, Ofile);
	putc(ch, Ifile);
}


writeout(string)
char	*string;
{
	register char 	*sp;

	sp = string;
	while (*sp)
		putc(*sp++,Ofile);
}


writein(string)
char	*string;
{
	register char	*sp;

	sp = string;
	while (*sp)
		putc(*sp++,Ifile);
}




/*
** Check to see if relation is wanted.
*/


notwanted(relname)
char	*relname;

{

	register char	**wantlist;
	register char	*nptr;

	if (*(wantlist = Wanted) == NULL)
		return (0);

	nptr = relname;
	do
		if (!scompare(nptr, 0, *wantlist++, 0))
			return (0);
	while (*wantlist != 0);
	return (1);
}