This commit is contained in:
Oliver Lehmann 1989-04-05 17:48:47 +00:00
parent 91e38cb9dd
commit 60146eec23
4 changed files with 799 additions and 0 deletions

View File

@ -0,0 +1,142 @@
# include <stdio.h>
/* Flag MSDOS is predefined in MSDOS */
# ifdef MSDOS
# include "../h/gen.h"
# else
# include "../conf/gen.h"
# endif
# ifdef MSDOS
# include "../h/ingres.h"
# include "../h/aux#.h"
# else
# include "../h/dbs.h"
# include "../h/aux.h"
# endif
# include "../h/access.h"
# include "../h/symbol.h"
# include "../h/catalog.h"
# include "../h/lock.h"
# define AMX_TRACE
# define AM_TRACE
# ifdef MSDOS
# define AAam_addbuf acc_addbuf
# define AAam_clearkeys clearkeys
# define AAam_delete delete
# define AAam_exit acc_close
# define AAam_flush_rel flush_rel
# define AAam_get get
# define AAam_insert insert
# define AAam_replace replace
# define AAam_setkey setkey
# define AAam_start acc_init
# define AAbequal bequal
# define AAbmove(s,d,l) memcpy(d,s,l)
# define AAcc_head Acc_head
# define AAccerror Accerror
# define AAdatabase Database
# define AAdbname Dbname
# define AAdbpath Dbpath
# define AAdmin Admin
# define AAdparam paramd
# define AAdumptid dumptid
# define AAerrfn errfilen
# define AAget_tuple get_tuple
# define AAgetequal getequal
# define AAgetpage get_page
# define AAicompare icompare
# define AAndxsearch ndxsearch
# define AApageflush pageflush
# define AApath Pathname
# define AApratt printatt
# define AAprkey prkey
# define AAprtup printup
# define AAput_tuple put_tuple
# define AArelclose closer
# define AArelopen openr
# define AAresetacc resetacc
# define AArhash rhash
# define AAsetcsl setcsl
# define AAsetdbl setdbl
# define AAsetpgl setpgl
# define AAsetrll setrll
# define AAstuff_page stuff_page
# define AAtTfp tTfp
# define AAunlall unlall
# define AAunlcs unlcs
# define AAunldb unldb
# define AAunlpg unlpg
# define AAunlrl unlrl
# define AAusercode Usercode
# define RELROPEN(fp) ((fp + 1) * 5)
# define RELWOPEN(fp) ((fp + 1) * -5)
# define attribute domain
extern char *AAdatabase;
extern char *memcpy();
typedef struct accbuf ACCBUF;
# else
extern char *AAbmove();
# endif
# ifndef bitset
# define bitset(b, s) ((b) & (s))
# define clrbit(b, s) ((s) &= ~(b))
# endif
# define DB_SHARE 0010
# define AP_EQ 0001
# define AP_LT 0002
# define AP_LE 0004
# define AP_NE 0010
# define AP_GT 0020
# define AP_GE 0040
# define AP_P1 0100
# define AP_P2 0200
# ifdef EBCDIC
# define LAST_CHAR 0377
# else
# define LAST_CHAR 0177
# endif
# define AA_rel AA_0
# define AA_att AA_1
# define AA_ind AA_2
struct descxx
{
DESC xx_desc;
struct descxx *xx_next;
struct descxx *xx_index;
char *xx_indom;
struct descxx *xx_ta;
char xx_refresh;
char xx_excl;
short xx_locks;
};
typedef struct descxx DESCXX;
extern struct descxx *AA_DESC;
extern struct descxx *AA_TA; /* begin of transaction */
extern struct descxx *AA_TE; /* end of transaction */
extern int AA_NOLOCKS;
extern int AA_LOCKS;
extern int AA_PAT;
extern DESC *AA_0; /* relation */
extern DESC *AA_1; /* attribute */
extern DESC *AA_2; /* indexes */
extern int AA;
extern long AA_LOW;
extern long AA_HIGH;
extern long AA_TID;
extern char *AA_STUP;
extern char *AAdbpath;
extern int errno;
/* UPDATE globals */
extern struct descxx *AAp_desc; /* global primary description */
extern char *AAold_tuple; /* global primary tuple pointer */
extern char AA_SET_ALL_KEYS[];
extern long AAdaemon;

View File

@ -0,0 +1,295 @@
# include "AA_liba.h"
/* FIND with AP_FULLKEY on HASH */
AAhash(d, lowtid, hightid, key)
register DESCXX *d;
register struct tup_id *lowtid;
register long *hightid;
char *key;
{
long pageid;
extern long AArhash();
# ifdef AMX_TRACE
AAtTfp(23, 0,
# ifdef MSDOS
"hash\t\t`%.10s' (%d)\n",
# else
"hash\t\t`%.14s' (%d)\n",
# endif
d->xx_desc.reldum.relid, AA_PAT);
# endif
errno = 0;
if (AA_PAT)
{
/* found a pattern in key */
AAbmove(&AA_LOW, lowtid, sizeof *lowtid);
*hightid = AA_HIGH;
}
else
{
pageid = AArhash(d, key);
AAstuff_page(lowtid, &pageid);
lowtid->line_id = SCANTID;
*hightid = *((long *) lowtid);
}
# ifdef AM_TRACE
AAtTfp(23, 10, "##AM_RHASH\n");
if (AAtTfp(23, 11, "##\t\toldkey"))
AAprkey(d, key);
if (AAtTfp(23, 12, "##\t\tlo_"))
AAdumptid(lowtid);
if (AAtTfp(23, 13, "##\t\thi_"))
AAdumptid(hightid);
# endif
}
/* FIND with AP_FULLKEY on ISAM */
AAisam(d, lowtid, hightid, given, key)
register DESCXX *d;
register long *lowtid;
register long *hightid;
register char *given;
register char *key;
{
# ifdef AMX_TRACE
AAtTfp(24, 0,
# ifdef MSDOS
"isam\t\t`%.10s' (%d)\n",
# else
"isam\t\t`%.14s' (%d)\n",
# endif
d->xx_desc.reldum.relid, AA_PAT);
# endif
errno = 0;
if (AA_PAT)
{
/* found a pattern in key */
AAlisam(d, lowtid, given, key);
AAhisam(d, hightid, given, key);
}
else
{
AA = AAndxsearch(d, lowtid, key, -1, 1);
# ifdef AM_TRACE
AAtTfp(24, 10, "##AM_=_SEARCH\t%d\n", AA);
if (AAtTfp(24, 11, "##\t\toldkey"))
AAprkey(d, key);
if (AAtTfp(24, 12, "##\t\tnew"))
AAdumptid(lowtid);
# endif
if (AA)
AAerror(8, d->xx_desc.reldum.relid);
*hightid = *lowtid;
}
}
/* FIND with AP_LOWKEY or AP_RANGEKEY on ISAM */
AAlisam(d, tid, given, lowkey, highkey)
register DESCXX *d;
long *tid;
char *given;
char *lowkey;
char *highkey;
{
register int i;
register char *dom;
register int len;
register int g;
register char *k;
register char *t;
struct accessparam ap;
char tuple[MAXTUP];
# ifdef AMX_TRACE
AAtTfp(25, 0,
# ifdef MSDOS
"low isam\t`%.10s' (%d)\n",
# else
"low isam\t`%.14s' (%d)\n",
# endif
d->xx_desc.reldum.relid, AA_PAT);
# endif
errno = 0;
/* clear out key conditions */
for (i = d->xx_desc.reldum.relatts; i; --i)
d->xx_desc.relgiven[i] = 0;
AAdparam(d, &ap);
dom = ap.keydno;
while (i = *dom++)
{
if (bitset(AP_EQ | AP_GT, g = given[i - 1]))
{
d->xx_desc.relgiven[i] = AP_GT;
len = d->xx_desc.reloff[i];
k = len + (bitset(AP_LT, g)? highkey: lowkey);
t = len + tuple;
len = ctou(d->xx_desc.relfrml[i]);
if (bitset(bitset(AP_LT, g)? AP_P2: AP_P1, g))
AApatmove(k, t, len, -1);
else
AAbmove(k, t, len);
}
}
AA = AAndxsearch(d, tid, tuple, -1, 0);
# ifdef AM_TRACE
AAtTfp(25, 10, "##AM_<_SEARCH\t%d\n", AA);
if (AAtTfp(25, 11, "##\t\toldkey"))
AAprkey(d, tuple);
if (AAtTfp(25, 12, "##\t\tlo_"))
AAdumptid(tid);
# endif
if (AA)
AAerror(9, d->xx_desc.reldum.relid);
/* restore key conditions */
AAbmove(given, &d->xx_desc.relgiven[1], d->xx_desc.reldum.relatts);
}
/* FIND with AP_HIGHKEY or AP_RANGEKEY on ISAM */
AAhisam(d, tid, given, key)
register DESCXX *d;
long *tid;
char *given;
char *key;
{
register int i;
register char *dom;
register int len;
register int g;
register char *k;
register char *t;
struct accessparam ap;
char tuple[MAXTUP];
# ifdef AMX_TRACE
AAtTfp(26, 0,
# ifdef MSDOS
"high isam\t`%.10s' (%d)\n",
# else
"high isam\t`%.14s' (%d)\n",
# endif
d->xx_desc.reldum.relid, AA_PAT);
# endif
errno = 0;
/* clear out key conditions */
for (i = d->xx_desc.reldum.relatts; i; --i)
d->xx_desc.relgiven[i] = 0;
AAdparam(d, &ap);
dom = ap.keydno;
while (i = *dom++)
{
if (bitset(AP_EQ | AP_LT, g = given[i - 1]))
{
d->xx_desc.relgiven[i] = AP_LT;
len = d->xx_desc.reloff[i];
k = len + key;
t = len + tuple;
len = ctou(d->xx_desc.relfrml[i]);
if (bitset(AP_P1, g))
AApatmove(k, t, len, 1);
else
AAbmove(k, t, len);
}
}
AA = AAndxsearch(d, tid, tuple, 1, 0);
# ifdef AM_TRACE
AAtTfp(26, 10, "##AM_>_SEARCH\t%d\n", AA);
if (AAtTfp(26, 11, "##\t\toldkey"))
AAprkey(d, tuple);
if (AAtTfp(26, 13, "##\t\thi_"))
AAdumptid(tid);
# endif
if (AA)
AAerror(10, d->xx_desc.reldum.relid);
/* restore key conditions */
AAbmove(given, &d->xx_desc.relgiven[1], d->xx_desc.reldum.relatts);
}
/*
** AApatmove -- copy a symbol to a new buffer area.
**
** AApatmove checks the symbol for
** pattern matching characters.
**
** Note that PAT_RBRAC need not be checked for
** since it is not a pattern matching char unless
** PAT_LBRAC appears before it.
**
** If op is opLTLE then add a pad character
** whose value is the largest possible char
** value.
**
** If any ranges of characters are found,
** then the lowest/highest char is taken from
** range.
*/
static AApatmove(key, tuple, len, op)
register char *key;
char *tuple;
register int len;
int op; /* op: LE = +1 */
/* GE = -1 */
{
register int c;
register int newc;
register char *tup;
tup = tuple;
tuple += len;
while (len--)
{
/* copy chars processing ANY, ONE or LBRAC chars if any */
if ((c = *key++) == PAT_ANY || c == PAT_ONE)
break;
if (c == PAT_LBRAC)
{
/* if string is empty, ignore it */
if (!len--)
break;
if ((c = *key++) == PAT_RBRAC)
continue; /* empty [] */
while (len-- && ((newc = *key++) != PAT_RBRAC))
{
/* ignore '-' */
if (newc == '-')
continue;
/* check for char larger/smaller than 'c' */
if (op * (newc - c) > 0)
c = newc;
}
}
*tup++ = c; /* copy next char */
}
while (tup < tuple)
*tup++ = (op > 0)? LAST_CHAR: 0;
}

View File

@ -0,0 +1,250 @@
# include "AA_liba.h"
int AA_PAT; /* pattern matching flag */
AAclearkeys(d, rel)
register DESCXX *d;
register char *rel;
{
# ifdef AMX_TRACE
AAtTfp(27, 0,
# ifdef MSDOS
"clear keys\t`%.10s'\n",
# else
"clear keys\t`%.14s'\n",
# endif
rel);
# endif
AA_PAT = 0;
errno = 0;
if (!d)
AAerror(106, rel);
AAam_clearkeys(d);
}
/*
** hunts through a string and converts the pattern matching
** characters and replaces with the corresponding cntrl chars
**
** Searches a string up to a null byte for one of the pattern
** matching characters '*', '?', '[', and ']'. It then converts
** these characters to their internal control character equivalents.
*/
AAsetpat(d, key, val, dom, cond)
register DESCXX *d;
char *key;
register char *val;
register int dom;
int cond;
{
register char *v;
register int pat;
register int c;
char val_buf[MAXFIELD];
# ifdef AMX_TRACE
AAtTfp(28, 0,
# ifdef MSDOS
"set pattern\t`%.10s' dom %d cond 0%o\n",
# else
"set pattern\t`%.14s' dom %d cond 0%o\n",
# endif
d->xx_desc.reldum.relid, dom, cond);
# endif
for (pat = 0, v = val_buf; *val; val++)
{
if (*val == '\\')
{
*v++ = *++val;
continue;
}
switch (*val)
{
case '*':
*v++ = PAT_ANY;
goto pat_found;
case '?':
*v++ = PAT_ONE;
goto pat_found;
case '[':
*v++ = PAT_LBRAC;
goto pat_found;
case ']':
*v++ = PAT_RBRAC;
pat_found:
pat++;
continue;
}
if (((c = *val & LAST_CHAR) < ' ' && c != '\n' && c != '\t') || c == LAST_CHAR)
c = ' '; /* convert to blank */
*v++ = c;
}
*v = 0;
AAsetkey(d, key, val_buf, dom, cond);
if (!pat)
return;
if ((pat = d->xx_desc.relxtra[dom]) && (!AA_PAT || AA_PAT > pat))
AA_PAT = pat;
switch (cond)
{
case AP_NE:
if (bitset(AP_GT, cond))
goto set_p2;
/* fall through */
case AP_GT:
case AP_GT | AP_GE:
if (bitset(AP_LT, cond))
{
set_p2:
d->xx_desc.relgiven[dom] |= AP_P2;
# ifdef AM_TRACE
goto all_set;
# else
return;
# endif
}
}
/* all others */
d->xx_desc.relgiven[dom] |= AP_P1;
# ifdef AM_TRACE
all_set:
AAtTfp(28, 10, "##AM_SETPAT\tnewcond 0%o\n", d->xx_desc.relgiven[dom]);
# endif
}
/*
** Searches a string up to a null byte for one of the pattern
** matching characters PAT_ANY, PAT_ONE, PAT_LBRAC, and PAT_RBRAC.
*/
AAsetind(d, key, val, dom, cond)
register DESCXX *d;
char *key;
char *val;
register int dom;
int cond;
{
register char *v;
register int len;
register int c;
register int pat;
# ifdef AMX_TRACE
AAtTfp(36, 0,
# ifdef MSDOS
"set index key\t`%.10s' dom %d cond 0%o\n",
# else
"set index key\t`%.14s' dom %d cond 0%o\n",
# endif
d->xx_desc.reldum.relid, dom, cond);
# endif
pat = 0;
if (d->xx_desc.relfrmt[dom] == CHAR)
{
len = ctou(d->xx_desc.relfrml[dom]);
for (v = val; len; --len)
if ((c = *v++) == PAT_ANY || c == PAT_ONE || c == PAT_LBRAC || c == PAT_RBRAC)
pat++;
}
AAsetkey(d, key, val, dom, cond);
if (!pat)
return;
if ((pat = d->xx_desc.relxtra[dom]) && (!AA_PAT || AA_PAT > pat))
AA_PAT = pat;
switch (cond)
{
case AP_NE:
if (bitset(AP_GT, cond))
goto set_p2;
/* fall through */
case AP_GT:
case AP_GT | AP_GE:
if (bitset(AP_LT, cond))
{
set_p2:
d->xx_desc.relgiven[dom] |= AP_P2;
# ifdef AM_TRACE
goto all_set;
# else
return;
# endif
}
}
/* all others */
d->xx_desc.relgiven[dom] |= AP_P1;
# ifdef AM_TRACE
all_set:
AAtTfp(36, 10, "##AM_SETIND\tnewcond 0%o\n", d->xx_desc.relgiven[dom]);
# endif
}
AAsetkey(d, key, val, dom, cond)
register DESCXX *d;
char *key;
char *val;
register int dom;
int cond;
{
if (dom <= 0 || dom > d->xx_desc.reldum.relatts)
{
AA = dom;
AAerror(13, d->xx_desc.reldum.relid);
}
# ifdef AMX_TRACE
AAtTfp(21, 0,
# ifdef MSDOS
"set key val\t`%.10s' dom %d cond 0%o\n",
# else
"set key val\t`%.14s' dom %d cond 0%o\n",
# endif
d->xx_desc.reldum.relid, dom, cond);
# endif
switch (cond)
{
case AP_EQ:
case AP_LT:
case AP_LT | AP_LE:
case AP_GT:
case AP_GT | AP_GE:
case AP_NE:
cond |= d->xx_desc.relgiven[dom];
AAam_setkey(d, key, val, dom);
d->xx_desc.relgiven[dom] = cond;
# ifdef AM_TRACE
AAtTfp(21, 10, "##AM_SETKEY\tnewcond 0%o\n", cond);
if (AAtTfp(21, 11, "##\t\tnewkey"))
AAprkey(d, key);
# endif
return;
}
AA = cond;
AAerror(14, d->xx_desc.reldum.relid);
}

View File

@ -0,0 +1,112 @@
# include <stdio.h>
# include "gen.h"
# include "../h/version.h"
char IIversion[] = VERSION;
# define AAbmove IIbmove
# define AAztack IIconcatv
# define AA_iocv IIitos
# define AApath IIPathname
# define AAerrfn IIerrfilen
# define AA_ERRFN II_ERRFN
# define AAversion IIversion
# include "../gutil/errfilen.c"
# include "../h/pipes.h"
# include "IIglobals.h"
# ifdef EBCDIC
# define LAST_CHAR 0377
# else
# define LAST_CHAR 0177
# endif
/*
** IIP_ERR
**
** This routine processes an IIerror call for printout.This involves doing
** a lookup in the .../sys/etc/error? files, where ? is the thous-
** ands digit of the error number. The associated error message
** then goes through parameter substitution and is printed.
**
** In the current version, the error message is just printed.
*/
char *IIp_err(err_num, argc, argv)
int err_num;
int argc;
char **argv;
{
register char *p;
register int c;
register FILE *iop;
short i;
char buf[100];
extern char *IIerrfilen();
/* open the appropriate error file */
p = IIerrfilen(err_num / 1000);
# ifdef xETR2
if (IIdebug > 1)
printf("P_ERR: file \"%s\"\n", p);
# endif
if (!(iop = fopen(p, "r")))
return ((char *) 0);
/* read in the code and check for correct */
for ( ; ; )
{
p = buf;
while ((c = getc(iop)) != '\t')
{
if (c <= 0)
{
fclose(iop);
return ((char *) 0);
}
*p++ = c;
}
*p = 0;
if (IIatoi(buf, &i))
goto error;
if (i != err_num)
{
while ((c = getc(iop)) != ERRDELIM)
if (c <= 0)
{
error:
IIsyserr("P_ERR: Formatfehler im file %d", err_num);
}
getc(iop); /* throw out the newline */
continue;
}
/* got the correct line, print it doing parameter substitution */
printf("%d: ", err_num);
for ( ; ; )
{
c = getc(iop);
if (c <= 0 || c == ERRDELIM)
{
putchar('\n');
fclose(iop);
return ((char *) 1);
}
if (c == '%')
{
c = getc(iop);
for (p = argv[c - '0']; c = *p; p++)
{
if (c < ' ' || c >= LAST_CHAR)
printf("\\0%o", c);
else
putchar(c);
}
continue;
}
putchar(c);
}
}
}