ING_DB
This commit is contained in:
parent
9754760a94
commit
c2f0294c39
|
|
@ -0,0 +1,733 @@
|
||||||
|
# include <stdio.h>
|
||||||
|
# include "gen.h"
|
||||||
|
# include "../h/dbs.h"
|
||||||
|
# include "../h/aux.h"
|
||||||
|
# include "../h/symbol.h"
|
||||||
|
# include "../h/access.h"
|
||||||
|
|
||||||
|
# define N MERGESIZE
|
||||||
|
# ifdef MEM_E
|
||||||
|
# define MEM COREBUFSIZE
|
||||||
|
char start[MEM] = {0};
|
||||||
|
# else
|
||||||
|
# define MEM ((char *) COREBUFSIZE)
|
||||||
|
# endif
|
||||||
|
# define BUCKETSIZE sizeof (long)
|
||||||
|
# define ENDKEY (MAXDOM + 1)
|
||||||
|
|
||||||
|
char SYSSORT[] = "_SYS";
|
||||||
|
|
||||||
|
static char File[15];
|
||||||
|
static char DBU_buf[TUP_BUF_SIZ];
|
||||||
|
static char *DBU_ptr;
|
||||||
|
static char Descsort[MAXDOM + 1];
|
||||||
|
static DESC Desc;
|
||||||
|
static char **Lspace;
|
||||||
|
static char *Tspace;
|
||||||
|
static char *Infile;
|
||||||
|
static char *Outfile;
|
||||||
|
char *Fileset;
|
||||||
|
static char *Filep;
|
||||||
|
char *AApath;
|
||||||
|
static long Ccount;
|
||||||
|
static long Page;
|
||||||
|
static long Tupsout;
|
||||||
|
static int Outpipe = -2; /* fd to write to modify */
|
||||||
|
static unsigned int Memory; /* available memory buffer size */
|
||||||
|
# ifdef VPGSIZE
|
||||||
|
int AApgsize = PGSIZE;
|
||||||
|
int AAmaxtup = MAXTUP;
|
||||||
|
int AAltsize = 0;
|
||||||
|
# endif
|
||||||
|
static short Trace;
|
||||||
|
static short Bucket;
|
||||||
|
static short Nfiles;
|
||||||
|
static short Nlines;
|
||||||
|
static short Reorg;
|
||||||
|
static short AppendOutput;
|
||||||
|
static struct tup_id Lowtid;
|
||||||
|
static struct tup_id Hightid;
|
||||||
|
|
||||||
|
extern int term();
|
||||||
|
extern int cmpa();
|
||||||
|
|
||||||
|
/*
|
||||||
|
** argv[0] -- sx_dbu for sorting or
|
||||||
|
** rx_dbu for reorganization
|
||||||
|
** and x is the fd for outfile or '_'
|
||||||
|
**
|
||||||
|
** argv[1] -- Fileset (process id)
|
||||||
|
**
|
||||||
|
** argv[2] -- trace information
|
||||||
|
** comes from trace flag Z23
|
||||||
|
**
|
||||||
|
** The bits used are:
|
||||||
|
** 0001 main trace info
|
||||||
|
** 0002 secondary trace info
|
||||||
|
** 0004 terciary trace info
|
||||||
|
** 0010 don't truncate temps
|
||||||
|
** 0020 don't unlink temps
|
||||||
|
** 0040 print am page refs
|
||||||
|
** 0100 print am tuple gets
|
||||||
|
**
|
||||||
|
** argv[3] -- pathname of DBS subtree
|
||||||
|
**
|
||||||
|
** argv[4] -- page size of data base
|
||||||
|
**
|
||||||
|
** argv[5] -- name of descritor file
|
||||||
|
**
|
||||||
|
** argv[6] -- name of infile
|
||||||
|
**
|
||||||
|
** argv[7] -- name of outfile
|
||||||
|
*/
|
||||||
|
main(argc, argv)
|
||||||
|
int argc;
|
||||||
|
char **argv;
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
register int j;
|
||||||
|
register int maxkey;
|
||||||
|
short rev;
|
||||||
|
# ifndef MEM_E
|
||||||
|
register char *start;
|
||||||
|
register char *stopp;
|
||||||
|
extern char *sbrk();
|
||||||
|
extern char *brk();
|
||||||
|
# endif
|
||||||
|
extern char *setfil();
|
||||||
|
extern char *AAproc_name;
|
||||||
|
extern int (*AAexitfn)();
|
||||||
|
|
||||||
|
AAproc_name = "DB_SORT";
|
||||||
|
AAexitfn = term;
|
||||||
|
|
||||||
|
Reorg = **argv == 'r';
|
||||||
|
if ((i = (*argv)[1]) != '_')
|
||||||
|
{
|
||||||
|
Outpipe = i - '0';
|
||||||
|
Outpipe = 10 * Outpipe + (*argv)[2] - '0';
|
||||||
|
}
|
||||||
|
|
||||||
|
Fileset = *++argv;
|
||||||
|
|
||||||
|
AA_atoi(*++argv, &Trace);
|
||||||
|
|
||||||
|
AApath = *++argv;
|
||||||
|
|
||||||
|
# ifdef VPGSIZE
|
||||||
|
AA_atoi(*++argv, &rev);
|
||||||
|
AApgsize = rev;
|
||||||
|
/* get the linetab size, the difference */
|
||||||
|
AAltsize = (PGSIZE - AApgsize) / sizeof (short);
|
||||||
|
# else
|
||||||
|
argv++;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
if (Trace & 01)
|
||||||
|
printf("DB_SORT: %s path %s set %s pipe %d\n",
|
||||||
|
Reorg? "Reorg": "Sort", AApath, Fileset, Outpipe);
|
||||||
|
|
||||||
|
if ((i = open(*++argv, 0)) < 0)
|
||||||
|
AAsyserr(11055, *argv);
|
||||||
|
if (read(i, &Desc, sizeof Desc) < sizeof Desc)
|
||||||
|
AAsyserr(11049);
|
||||||
|
close(i);
|
||||||
|
|
||||||
|
/* set up Descsort to indicate the sort order for tuple */
|
||||||
|
/* if domain zero is given prepare to generate "hash bucket"
|
||||||
|
** value for tuple */
|
||||||
|
maxkey = 0;
|
||||||
|
for (i = 0; i <= Desc.reldum.relatts; i++)
|
||||||
|
if (j = Desc.relgiven[i])
|
||||||
|
{
|
||||||
|
if ((rev = j) < 0)
|
||||||
|
j = -j;
|
||||||
|
if (maxkey < j)
|
||||||
|
maxkey = j;
|
||||||
|
Descsort[--j] = rev < 0? -i: i;
|
||||||
|
}
|
||||||
|
|
||||||
|
Descsort[maxkey] = ENDKEY; /* mark end of list */
|
||||||
|
|
||||||
|
Tup_size = Desc.reldum.relwid;
|
||||||
|
|
||||||
|
if (Bucket = !Descsort[0])
|
||||||
|
{
|
||||||
|
/* we will be generating hash bucket */
|
||||||
|
Tup_size += BUCKETSIZE;
|
||||||
|
Desc.relfrml[0] = BUCKETSIZE;
|
||||||
|
Desc.relfrmt[0] = INT;
|
||||||
|
Desc.reloff[0] = Desc.reldum.relwid;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Trace & 01)
|
||||||
|
{
|
||||||
|
printf("Bucket is %d,Sort is:\n", Bucket);
|
||||||
|
for (i = 0; ctou(j = Descsort[i]) != ENDKEY; i++)
|
||||||
|
printf("Descsort[%d]=%d\n", i, j);
|
||||||
|
}
|
||||||
|
if (i = (maxkey - Bucket - Desc.reldum.relatts))
|
||||||
|
AAsyserr(11050, -i);
|
||||||
|
|
||||||
|
Infile = *++argv;
|
||||||
|
|
||||||
|
Outfile = (Outpipe > 0)? "PIPE": *++argv;
|
||||||
|
|
||||||
|
# ifdef MEM_E
|
||||||
|
Memory = MEM;
|
||||||
|
# else
|
||||||
|
/* get up to MEM-K bytes of memory for buffers. Note that mem */
|
||||||
|
/* must end up positive so that Nlines computation is right */
|
||||||
|
start = sbrk((char *) 0);
|
||||||
|
stopp = MEM;
|
||||||
|
while (brk(stopp) == (char *) -1)
|
||||||
|
stopp -= 512;
|
||||||
|
Memory = stopp - start;
|
||||||
|
# endif
|
||||||
|
Lspace = (char **) start;
|
||||||
|
|
||||||
|
/* compute pointers and sizes into buffer memory */
|
||||||
|
Nlines = Memory / (Tup_size + sizeof (char *));
|
||||||
|
Tspace = (char *) (Lspace + Nlines);
|
||||||
|
if (Trace & 01)
|
||||||
|
printf("Tspace=0%o,Lspace=0%o,Nlines=%u,mem=0%o,start=0%o\n",
|
||||||
|
Tspace, Lspace, Nlines, Memory, start);
|
||||||
|
|
||||||
|
/* set up temp files */
|
||||||
|
AAconcat(AAztack(SYSSORT, Fileset), "Sxxxx", File);
|
||||||
|
for (Filep = File; *Filep != 'x'; Filep++)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* initialize tids for full scan */
|
||||||
|
Page = 0L;
|
||||||
|
Lowtid.line_id = SCANTID;
|
||||||
|
AAstuff_page(&Lowtid, &Page);
|
||||||
|
Page = -1L;
|
||||||
|
Hightid.line_id = SCANTID;
|
||||||
|
AAstuff_page(&Hightid, &Page);
|
||||||
|
Page = 1L;
|
||||||
|
|
||||||
|
/* open relation */
|
||||||
|
close(0);
|
||||||
|
if ((Desc.relfp = open(Infile, 0)) < 0)
|
||||||
|
AAsyserr(11055, Infile);
|
||||||
|
Desc.relopn = RELROPEN(Desc.relfp);
|
||||||
|
|
||||||
|
signal(2, term);
|
||||||
|
signal(3, term);
|
||||||
|
|
||||||
|
while (Desc.relopn)
|
||||||
|
{
|
||||||
|
/* sort stage -- create a bunch of temporaries */
|
||||||
|
Ccount = 0;
|
||||||
|
Tupsout = 0;
|
||||||
|
Nfiles = 1;
|
||||||
|
if (Trace & 01)
|
||||||
|
printf("sorting\n");
|
||||||
|
sort();
|
||||||
|
if (Trace & 01)
|
||||||
|
{
|
||||||
|
printf("done sorting\n%ld tuples written to %d files\n", Tupsout, Nfiles - 1);
|
||||||
|
printf("sort required %ld compares\n", Ccount);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* merge stage -- merge up to N temps into a new temp */
|
||||||
|
Ccount = 0;
|
||||||
|
for (i = 1; i + N < Nfiles; i += N)
|
||||||
|
{
|
||||||
|
makfile(setfil(Nfiles++));
|
||||||
|
merge(i, i + N);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* merge last set of temps into target file */
|
||||||
|
if (i != Nfiles)
|
||||||
|
{
|
||||||
|
oldfile();
|
||||||
|
merge(i, Nfiles);
|
||||||
|
}
|
||||||
|
if (Trace & 01)
|
||||||
|
{
|
||||||
|
printf("%ld tuples in out file\n", Tupsout);
|
||||||
|
printf("merge required %ld compares\n", Ccount);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
term(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sort()
|
||||||
|
{
|
||||||
|
register char *cp;
|
||||||
|
register char **lp;
|
||||||
|
register int i;
|
||||||
|
register int done;
|
||||||
|
char *xp;
|
||||||
|
long ntups;
|
||||||
|
long pageid;
|
||||||
|
extern char *setfil();
|
||||||
|
extern long AArhash();
|
||||||
|
extern char *AAbmove();
|
||||||
|
|
||||||
|
done = 0;
|
||||||
|
ntups = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
cp = Tspace;
|
||||||
|
lp = Lspace;
|
||||||
|
while (lp < Lspace + Nlines)
|
||||||
|
{
|
||||||
|
if (i = AAam_get(&Desc, &Lowtid, &Hightid, cp, TRUE))
|
||||||
|
{
|
||||||
|
if (i < 0)
|
||||||
|
AAsyserr(11051, i);
|
||||||
|
|
||||||
|
close(Desc.relfp);
|
||||||
|
Desc.relopn = 0;
|
||||||
|
goto step_ok;
|
||||||
|
}
|
||||||
|
if (Reorg && Page != AAcc_head->mainpg)
|
||||||
|
{
|
||||||
|
Page = AAcc_head->mainpg;
|
||||||
|
Lowtid.line_id = SCANTID;
|
||||||
|
step_ok:
|
||||||
|
done++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (Bucket)
|
||||||
|
{
|
||||||
|
/* compute hash bucket and insert at end */
|
||||||
|
pageid = AArhash(&Desc, cp);
|
||||||
|
AAbmove(&pageid, cp + Desc.reldum.relwid, BUCKETSIZE);
|
||||||
|
}
|
||||||
|
*lp++ = cp;
|
||||||
|
cp += Tup_size;
|
||||||
|
ntups++;
|
||||||
|
}
|
||||||
|
|
||||||
|
qsort(Lspace, lp - Lspace, sizeof (char *), cmpa);
|
||||||
|
|
||||||
|
if (!done || Nfiles != 1)
|
||||||
|
makfile(setfil(Nfiles++));
|
||||||
|
else
|
||||||
|
oldfile();
|
||||||
|
|
||||||
|
while (lp > Lspace)
|
||||||
|
{
|
||||||
|
cp = *--lp;
|
||||||
|
xp = cp;
|
||||||
|
if ((lp == Lspace) || cmpa(&xp, &lp[-1]))
|
||||||
|
{
|
||||||
|
tup_write(cp);
|
||||||
|
Tupsout++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Tup_fd != Outpipe)
|
||||||
|
tup_close();
|
||||||
|
} while (!done);
|
||||||
|
if (Trace & 01)
|
||||||
|
printf("%ld tuples in\n", ntups);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
merge(low, high)
|
||||||
|
int low;
|
||||||
|
int high;
|
||||||
|
{
|
||||||
|
register struct tup_hdr *merg;
|
||||||
|
register int i;
|
||||||
|
register int j;
|
||||||
|
register char *f;
|
||||||
|
register unsigned int blen;
|
||||||
|
register unsigned int mlen;
|
||||||
|
register char *mem;
|
||||||
|
char *yesno;
|
||||||
|
struct tup_hdr *merg_buf[N + 1];
|
||||||
|
extern char *setfil();
|
||||||
|
|
||||||
|
if (Trace & 02)
|
||||||
|
printf("merge %d to %d\n", low, high);
|
||||||
|
|
||||||
|
/* compute length of merge buffers */
|
||||||
|
j = sizeof (struct tup_hdr);
|
||||||
|
i = ((Memory / (high - low)) - j) / PGSIZE;
|
||||||
|
if ((blen = i * PGSIZE) > 32768L - PGSIZE)
|
||||||
|
blen = 32768L - PGSIZE;
|
||||||
|
mlen = ALIGNMENT(j + blen);
|
||||||
|
blen += PGSIZE;
|
||||||
|
|
||||||
|
if (Trace & 02)
|
||||||
|
printf("merge mem 0%o buflen 0%o\n", Memory, blen);
|
||||||
|
|
||||||
|
mem = (char *) Lspace;
|
||||||
|
for (j = 0, i = low; i < high; i++)
|
||||||
|
{
|
||||||
|
merg_buf[j] = merg = (struct tup_hdr *) mem;
|
||||||
|
|
||||||
|
if ((merg->tup_fd = open(f = setfil(i), 0)) < 0)
|
||||||
|
AAsyserr(11055, f);
|
||||||
|
|
||||||
|
merg->tup_ptr = merg->tup_buf;
|
||||||
|
merg->tup_end = merg->tup_buf;
|
||||||
|
merg->tup_len = blen;
|
||||||
|
merg->tup_no = i;
|
||||||
|
if (!next_tuple(merg))
|
||||||
|
j++;
|
||||||
|
mem += mlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
i = j - 1;
|
||||||
|
if (Trace & 04)
|
||||||
|
printf("start merg with %d\n", i);
|
||||||
|
while (i >= 0)
|
||||||
|
{
|
||||||
|
if (Trace & 04)
|
||||||
|
printf("mintup %d\n", i);
|
||||||
|
if (mintup(merg_buf, i, cmpa))
|
||||||
|
{
|
||||||
|
tup_write(merg_buf[i]->tup_ptr);
|
||||||
|
Tupsout++;
|
||||||
|
}
|
||||||
|
if (next_tuple(merg = merg_buf[i]))
|
||||||
|
{
|
||||||
|
yesno = "not ";
|
||||||
|
if (!(Trace & 010))
|
||||||
|
{
|
||||||
|
/* truncate temporary files to zero length */
|
||||||
|
yesno = "";
|
||||||
|
close(creat(setfil(merg->tup_no), FILEMODE));
|
||||||
|
}
|
||||||
|
if (Trace & 02 || Trace & 010)
|
||||||
|
printf("dropping and %struncating %s\n", yesno, setfil(merg->tup_no));
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Tup_fd != Outpipe)
|
||||||
|
tup_close();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Mintup puts the smallest tuple in merg_buf[cnt-1].
|
||||||
|
** If the tuple is a duplicate of another then
|
||||||
|
** mintup returns 0, else 1.
|
||||||
|
**
|
||||||
|
** Cnt is the number of compares to make; i.e.
|
||||||
|
** merg_buf[cnt] is the last element.
|
||||||
|
*/
|
||||||
|
mintup(merg_buf, cnt, cmpfunc)
|
||||||
|
struct tup_hdr *merg_buf[];
|
||||||
|
int cnt;
|
||||||
|
int (*cmpfunc)();
|
||||||
|
{
|
||||||
|
register struct tup_hdr **next;
|
||||||
|
register struct tup_hdr **last;
|
||||||
|
register int nodup;
|
||||||
|
register struct tup_hdr *temp;
|
||||||
|
register int j;
|
||||||
|
|
||||||
|
nodup = TRUE;
|
||||||
|
next = merg_buf;
|
||||||
|
last = &next[cnt];
|
||||||
|
|
||||||
|
while (cnt--)
|
||||||
|
{
|
||||||
|
if (j = (*cmpfunc)(*last, *next))
|
||||||
|
{
|
||||||
|
/* tuples not equal. keep smallest */
|
||||||
|
if (j < 0)
|
||||||
|
{
|
||||||
|
/* exchange */
|
||||||
|
temp = *last;
|
||||||
|
*last = *next;
|
||||||
|
*next = temp;
|
||||||
|
nodup = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
nodup = FALSE;
|
||||||
|
|
||||||
|
next++;
|
||||||
|
}
|
||||||
|
return (nodup);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
next_tuple(merg)
|
||||||
|
register struct tup_hdr *merg;
|
||||||
|
{
|
||||||
|
register int eof;
|
||||||
|
extern char *tup_read();
|
||||||
|
|
||||||
|
if (eof = !tup_read(merg))
|
||||||
|
close(merg->tup_fd);
|
||||||
|
|
||||||
|
return (eof);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Convert the number i to a char
|
||||||
|
** sequence 1, 2, ..., 10, 11, etc.
|
||||||
|
*/
|
||||||
|
char *setfil(i)
|
||||||
|
register int i;
|
||||||
|
{
|
||||||
|
AA_itoa(--i, Filep);
|
||||||
|
return (File);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
oldfile()
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
register char *name;
|
||||||
|
register int fd;
|
||||||
|
long off;
|
||||||
|
extern long lseek();
|
||||||
|
extern char *AAbmove();
|
||||||
|
|
||||||
|
name = Outfile;
|
||||||
|
|
||||||
|
if (Trace & 02)
|
||||||
|
printf("OLDFILE: %s\n", name);
|
||||||
|
|
||||||
|
if (Outpipe > 0)
|
||||||
|
{
|
||||||
|
if (AppendOutput)
|
||||||
|
{
|
||||||
|
if (Tup_fd == Outpipe)
|
||||||
|
return;
|
||||||
|
if (i = DBU_ptr - DBU_buf)
|
||||||
|
Tup_ptr = AAbmove(DBU_buf, Tup_buf, i);
|
||||||
|
else
|
||||||
|
Tup_ptr = Tup_buf;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Tup_ptr = Tup_buf;
|
||||||
|
Tup_fd = Outpipe;
|
||||||
|
}
|
||||||
|
else if (AppendOutput)
|
||||||
|
{
|
||||||
|
if ((fd = open(name, 2)) < 0)
|
||||||
|
AAsyserr(11055, name);
|
||||||
|
if ((off = lseek(fd, 0L, 2)) < 0)
|
||||||
|
AAsyserr(11055, name);
|
||||||
|
if (i = off % PGSIZE)
|
||||||
|
{
|
||||||
|
if (lseek(fd, off - i, 0) < 0 || read(fd, Tup_buf, i) != i)
|
||||||
|
AAsyserr(11055, name);
|
||||||
|
lseek(fd, off - i, 0);
|
||||||
|
}
|
||||||
|
Tup_ptr = &Tup_buf[i];
|
||||||
|
Tup_fd = fd;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
makfile(name);
|
||||||
|
|
||||||
|
AppendOutput++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
makfile(name)
|
||||||
|
register char *name;
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
extern char *AAbmove();
|
||||||
|
|
||||||
|
if (Trace & 02)
|
||||||
|
printf("MAKFILE: %s\n", name);
|
||||||
|
|
||||||
|
if (Outpipe > 0 && AppendOutput)
|
||||||
|
{
|
||||||
|
if (i = Tup_ptr - Tup_buf)
|
||||||
|
DBU_ptr = AAbmove(Tup_buf, DBU_buf, i);
|
||||||
|
else
|
||||||
|
DBU_ptr = DBU_buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((Tup_fd = creat(name, FILEMODE)) < 0)
|
||||||
|
AAsyserr(11055, name);
|
||||||
|
|
||||||
|
Tup_ptr = Tup_buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
term(error)
|
||||||
|
register int error;
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
extern char *setfil();
|
||||||
|
|
||||||
|
if (Nfiles == 1)
|
||||||
|
Nfiles++;
|
||||||
|
|
||||||
|
if (Trace & 020)
|
||||||
|
printf("temp files not removed\n");
|
||||||
|
else
|
||||||
|
for (i = 1; i < Nfiles; i++)
|
||||||
|
unlink(setfil(i));
|
||||||
|
|
||||||
|
if (Tup_fd >= 0)
|
||||||
|
tup_close();
|
||||||
|
|
||||||
|
if (Outpipe > 0)
|
||||||
|
close(Outpipe);
|
||||||
|
|
||||||
|
fflush(stdout);
|
||||||
|
sync();
|
||||||
|
exit(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AAunlall()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
cmpa(a, b)
|
||||||
|
char **a;
|
||||||
|
char **b;
|
||||||
|
{
|
||||||
|
register char *tupa;
|
||||||
|
register char *tupb;
|
||||||
|
register int frml;
|
||||||
|
register int i;
|
||||||
|
register int dom;
|
||||||
|
register int off;
|
||||||
|
char *dp;
|
||||||
|
int frmt;
|
||||||
|
char *pa;
|
||||||
|
char *pb;
|
||||||
|
char af[sizeof (double)];
|
||||||
|
char bf[sizeof (double)];
|
||||||
|
|
||||||
|
pa = *a;
|
||||||
|
pb = *b;
|
||||||
|
Ccount++;
|
||||||
|
dp = Descsort;
|
||||||
|
while (ctou(i = *dp++) != ENDKEY)
|
||||||
|
{
|
||||||
|
if ((dom = i) < 0)
|
||||||
|
dom = -i;
|
||||||
|
frml = ctou(Desc.relfrml[dom]);
|
||||||
|
frmt = Desc.relfrmt[dom];
|
||||||
|
off = Desc.reloff[dom];
|
||||||
|
tupa = &pa[off];
|
||||||
|
tupb = &pb[off];
|
||||||
|
if (i < 0)
|
||||||
|
{
|
||||||
|
tupb = tupa;
|
||||||
|
tupa = &pb[off];
|
||||||
|
}
|
||||||
|
if (frmt == CHAR)
|
||||||
|
{
|
||||||
|
if (i = AAscompare(tupb, frml, tupa, frml))
|
||||||
|
return (i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* domain is a numeric type */
|
||||||
|
if (AAbequal(tupa, tupb, frml))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* copy to even word boundary */
|
||||||
|
AAbmove(tupa, af, frml);
|
||||||
|
AAbmove(tupb, bf, frml);
|
||||||
|
tupa = af;
|
||||||
|
tupb = bf;
|
||||||
|
|
||||||
|
switch (frmt)
|
||||||
|
{
|
||||||
|
case INT:
|
||||||
|
switch (frml)
|
||||||
|
{
|
||||||
|
case sizeof (char):
|
||||||
|
return (ctoi(((I1TYPE *) tupa)->i1type) > ctoi(((I1TYPE *) tupb)->i1type)? -1: 1);
|
||||||
|
|
||||||
|
case sizeof (short):
|
||||||
|
return (((I2TYPE *) tupa)->i2type > ((I2TYPE *) tupb)->i2type? -1: 1);
|
||||||
|
|
||||||
|
case sizeof (long):
|
||||||
|
return (((I4TYPE *) tupa)->i4type > ((I4TYPE *) tupb)->i4type? -1: 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
case FLOAT:
|
||||||
|
# ifndef NO_F4
|
||||||
|
switch (frml)
|
||||||
|
{
|
||||||
|
case sizeof (float):
|
||||||
|
return (((F4TYPE *) tupa)->f4type > ((F4TYPE *) tupb)->f4type? -1: 1);
|
||||||
|
|
||||||
|
case sizeof (double):
|
||||||
|
# endif
|
||||||
|
return (((F8TYPE *) tupa)->f8type > ((F8TYPE *) tupb)->f8type? -1: 1);
|
||||||
|
# ifndef NO_F4
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Replacement for access method routine AAgetpage();
|
||||||
|
** and associated globals and routines.
|
||||||
|
*/
|
||||||
|
ACCBUF *AAcc_head;
|
||||||
|
static ACCBUF AAcc_buf;
|
||||||
|
static long AAccuread;
|
||||||
|
static long AAccuwrite;
|
||||||
|
|
||||||
|
AAgetpage(d, tid)
|
||||||
|
register DESC *d;
|
||||||
|
struct tup_id *tid;
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
register ACCBUF *b;
|
||||||
|
long pageid;
|
||||||
|
extern long lseek();
|
||||||
|
|
||||||
|
if (Trace & 0100)
|
||||||
|
{
|
||||||
|
printf("GET_PAGE: %.14s,", d->reldum.relid);
|
||||||
|
AAdumptid(tid);
|
||||||
|
}
|
||||||
|
if (!(b = AAcc_head))
|
||||||
|
{
|
||||||
|
/* initialize buffer */
|
||||||
|
AAcc_head = &AAcc_buf;
|
||||||
|
b = &AAcc_buf;
|
||||||
|
b->thispage = -1L;
|
||||||
|
}
|
||||||
|
AApluck_page(tid, &pageid);
|
||||||
|
i = 0;
|
||||||
|
if (b->thispage != pageid)
|
||||||
|
{
|
||||||
|
if (Trace & 040)
|
||||||
|
printf("GET_PAGE: rdg pg %ld\n", pageid);
|
||||||
|
b->thispage = pageid;
|
||||||
|
if (lseek(d->relfp, pageid * AApgsize, 0) < 0L)
|
||||||
|
i = AMSEEK_ERR;
|
||||||
|
else if (read(d->relfp, b, AApgsize) != AApgsize)
|
||||||
|
i = AMREAD_ERR;
|
||||||
|
AAccuread++;
|
||||||
|
}
|
||||||
|
return (i);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AAresetacc()
|
||||||
|
{
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AAam_error(err)
|
||||||
|
register int err;
|
||||||
|
{
|
||||||
|
return (err);
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue