4.3BSD/usr/ingres/source/support/indconv.q
# include <sccs.h>
SCCSID(@(#)indconv.q 8.1 12/31/84)
# define MAXNAME 12
# define M_HEAP 5
# define M_ISAM 11
# define M_HASH 21
## char *Usercode;
struct
{
char relname[MAXNAME + 1], indname[MAXNAME + 1], relsp[10];
char domname[7][MAXNAME + 1], modseq[7];
} Indinfo[100];
struct relspec
{
char specnum, *specname;
};
struct relspec relspecs[]
{
M_ISAM, "isam",
M_HASH, "hash",
-M_ISAM, "cisam",
-M_HASH, "chash",
M_HEAP, "heap",
-M_HEAP, "cheap",
0
};
main(argc, argv)
int argc;
char *argv[];
{
char *kp;
## char aname[20];
## char keystring[100];
## char pname[20], iname[20];
## char *db;
## int cnt, i, j, rspec, aid, akey;
if (argc != 2)
syserr(0, "wrong number of parameters");
db = argv[1];
if (initucode(db, 0, 0, 0, 0))
syserr(0, "cannot access %s data base", db);
## ingres db "-nheap"
cnt = 0;
## range of r is relation
## retrieve (iname = r.relid, rspec = r.relspec)
## where r.relindxd < 0 and r.relindxd != -2 and r.relowner = Usercode
## {
smove(iname, Indinfo[cnt].indname);
for (i = 0; relspecs[i].specnum != 0; i++)
{
if (rspec == relspecs[i].specnum)
{
smove(relspecs[i].specname, Indinfo[cnt].relsp);
break;
}
}
for (i = 0; i < 7; i++)
Indinfo[cnt].modseq[i] = -1;
if (++cnt >= 100)
{
printf("There are more indices than I can convert\n");
printf("\tso run me again to finish the rest\n");
break;
}
## }
## range of x is indexes
## retrieve (pname = x.irelidp, iname = x.irelidi)
## where x.iownerp = Usercode
## {
for (i = 0; i < cnt; i++)
{
if (sequal(iname, Indinfo[i].indname))
{
smove(pname, Indinfo[i].relname);
break;
}
}
## }
## range of a is attribute
## retrieve (iname = a.attrelid, aname = a.attname, aid = a.attid,
## akey = a.attxtra)
## where a.attowner = Usercode
## {
for (i = 0; i < cnt; i++)
{
if (sequal(iname, Indinfo[i].indname))
{
if (akey > 0)
Indinfo[i].modseq[akey - 1] = aid - 1;
smove(aname, Indinfo[i].domname[aid - 1]);
break;
}
}
## }
for (i = 0; i < cnt; i++)
{
smove(Indinfo[i].indname, iname);
## destroy iname
}
for (i = 0; i < cnt; i++)
{
kp = &keystring[0];
for (j = 0; j < 7; j++)
{
if (sequal("tidp", Indinfo[i].domname[j]))
break;
if (j > 0)
xmove(", ", &kp);
xmove(Indinfo[i].domname[j], &kp);
}
smove(Indinfo[i].relname, pname);
smove(Indinfo[i].indname, iname);
## index on pname is iname (keystring)
}
for (i = 0; i < cnt; i++)
{
kp = &keystring[0];
for (j = 0; j < 7 && Indinfo[i].modseq[j] != -1; j++)
{
if (j > 0)
xmove(", ", &kp);
xmove(Indinfo[i].domname[Indinfo[i].modseq[j]], &kp);
}
smove(Indinfo[i].indname, iname);
smove(Indinfo[i].relsp, pname);
if (j == 0)
{
## modify iname to pname
printf("write to Bob Epstein for a free INGRES T-shirt\n");
}
else
{
## modify iname to pname on keystring
}
printf("index %s converted.\n", iname);
}
printf("done\n");
}
sequal(ax, bx)
char *ax, *bx;
{
register char *a, *b;
a = --ax;
b = --bx;
while (*++a == *++b)
if (*a == 0)
return (1);
if (*a == 0)
{
while (*b == ' ')
b++;
if (*b)
return (0);
return (1);
}
if (*b == 0)
{
while (*a == ' ')
a++;
if (*a)
return (0);
return (1);
}
return (0);
}
smove(ax, bx)
char *ax, *bx;
{
register char *a, *b;
a = ax;
b = bx;
while (*b++ = *a++);
return (0);
}
xmove(ax, bx)
char *ax, **bx;
{
register char *a, *b;
a = ax;
b = *bx;
while (*b++ = *a++);
*bx = --b;
return (0);
}