This commit is contained in:
Oliver Lehmann 1990-01-23 12:14:03 +00:00
parent 9a97ccdc3f
commit d37ea1fff5
1 changed files with 271 additions and 0 deletions

View File

@ -0,0 +1,271 @@
# include "amx.h"
/* LOOKUP RELATION "name" */
rel_lookup(rel, status)
register char *rel;
int status;
{
register AMX_REL *r;
register AMX_ATT *a;
register int i;
register int j;
register DESC *d;
register char *p;
# ifdef AMX_SC
int decl;
# endif
struct relation rel_key;
struct relation rel_tup;
struct attribute dom_key;
struct attribute dom_tup;
struct index ind_key;
struct index ind_tup;
struct tup_id tid1;
struct tup_id tid2;
int primary;
extern int write();
extern AMX_REL *getrel();
extern AMX_REL *talloc();
r = (AMX_REL *) 0;
for (p = Reltab, i = 0; i < Relcount; i++, p += MAXNAME + 1)
if (AAsequal(p, rel))
{
r = getrel(i, 1);
break;
}
if (r)
{
if (!status && bitset(AMX_INTERNAL, r->rel_status))
yyexit(12, rel);
Relation = r;
return;
}
/* CREATE a new relation entry */
/* Step 1: get the relation tuple */
d = &AAdmin.adreld;
AAam_clearkeys(d);
AAam_setkey(d, &rel_key, rel, RELID);
AAam_setkey(d, &rel_key, AAusercode, RELOWNER);
if ((i = AAgetequal(d, &rel_key, &rel_tup, &tid1)) == 1)
{
/* not a user relation, try owned by dba */
AAam_setkey(d, &rel_key, AAdmin.adhdr.adowner, RELOWNER);
i = AAgetequal(d, &rel_key, &rel_tup, &tid1);
}
if (i)
yyexit((i == 1)? 82: 8, rel);
/* Step 2: allocate symbol space */
r = Temp_rel;
if (Relcount >= MAX_RELS)
yyexit(10, rel);
/* Step 3: fill in the relation part */
AAsmove(rel, &Reltab[Relcount * (MAXNAME + 1)]);
r->rel_index = MAX_RELS;
# ifdef AMX_QRYMOD
r->rel_qm = (AMX_QM *) 0;
AAbmove(rel_tup.relowner, r->rel_owner, 2);
# endif
r->rel_uniq = Relcount++;
AAsmove(rel, r->rel_id);
r->rel_status = status;
r->rel_spec = rel_tup.relspec;
r->rel_wid = rel_tup.relwid;
r->rel_wid = ALIGNMENT(r->rel_wid);
r->ind_wid = 0;
r->rel_atts = rel_tup.relatts;
/* Step 4: check for valid relation */
i = rel_tup.relstat;
if (status)
goto internal;
/* ------- check for protection tuples */
if (!AAbequal(AAusercode, rel_tup.relowner, 2))
{
if (!bitset(S_PROTALL, i))
goto all_perm;
if (!bitset(S_PROTRET, i))
r->rel_status |= AMX_RETRIEVE;
if (rel_perm(r, rel_tup.relstat & S_PROTUPS))
yyexit(12, rel);
}
else
{
all_perm:
r->rel_status |= AMX_RETRIEVE | AMX_REPLACE | AMX_DELETE | AMX_APPEND;
}
/* ------- check for integrity tuples */
if (bitset(S_INTEG, i))
yyexit(14, rel);
/* ------- view check */
if (bitset(S_VIEW, i))
yyexit(16, rel);
internal:
# ifdef AMX_SC
decl = ExpImp < 0;
# endif
/* ------- check for system catalog */
if (bitset(S_CATALOG, i))
{
r->rel_status |= AMX_CATALOG;
clrbit(AMX_REPLACE | AMX_DELETE | AMX_APPEND, r->rel_status);
}
/* ------- check for index relation */
else if (bitset(S_INDEX, i) || ctoi(rel_tup.relindxd) == SECINDEX)
{
r->rel_status |= AMX_INDEX;
clrbit(AMX_RETRIEVE | AMX_REPLACE | AMX_DELETE | AMX_APPEND, r->rel_status);
Relation->rel_index = r->rel_uniq;
swaprel(Relation, write);
}
else /* user relation */
{
r = getrel(r->rel_uniq, 1);
Temp_rel[0].rel_uniq = MAX_RELS;
Relation = r;
if (bitset(S_NOUPDT, i))
clrbit(AMX_REPLACE | AMX_DELETE | AMX_APPEND, r->rel_status);
if (ctoi(rel_tup.relindxd) == SECBASE)
{ /* relation has indexes */
r->rel_status |= AMX_PRIMARY;
d = &Indes;
AAam_clearkeys(d);
AAam_setkey(d, &ind_key, rel, IRELIDP);
AAam_setkey(d, &ind_key, rel_tup.relowner, IOWNERP);
if (AAam_find(d, EXACTKEY, &tid1, &tid2, &ind_key))
yyexit(18, rel);
while (!(i = AAam_get(d, &tid1, &tid2, &ind_tup, TRUE)))
{
if (AAkcompare(d, &ind_tup, &ind_key))
continue;
/* found one */
/* make a string, */
/* overwriting irelspeci */
ind_tup.irelspeci = ' ';
for (p = ind_tup.irelidi; *p != ' '; p++)
continue;
*p = '\0';
/* save primary relation */
swaprel(r, write);
primary = r->rel_uniq;
rel_lookup(ind_tup.irelidi, AMX_INTERNAL);
/* restore primary relation */
r = getrel(primary, 0);
if (r->ind_wid < Relation->rel_wid)
r->ind_wid = Relation->rel_wid;
for (i = 0; i < MAXKEYS && ind_tup.idom[i]; )
i++;
/* make a string */
AAbmove(ind_tup.idom, Relation->ind_dom, i);
Relation->ind_dom[i] = '\0';
/* complete INDEX-relation */
swaprel(Relation, write);
fprintf(FILE_amx,
# ifdef AMX_SC
msg(166 + decl), Relation->rel_uniq);
if (decl)
continue;
# else
msg(166), Relation->rel_uniq);
# endif
for (j = 0; j < i; j++)
fprintf(FILE_amx, "\\%o", ctou(Relation->ind_dom[j]));
fprintf(FILE_amx, "\";\n");
}
if (i < 0)
yyexit(20, rel);
}
}
/* Step 5: get the attribute tuples */
d = &AAdmin.adattd;
AAam_clearkeys(d);
AAam_setkey(d, &dom_key, rel_tup.relid, ATTRELID);
AAam_setkey(d, &dom_key, rel_tup.relowner, ATTOWNER);
if (AAam_find(d, EXACTKEY, &tid1, &tid2, &dom_key))
yyexit(22, rel);
/* zero out all format types */
i = rel_tup.relatts;
for (a = r->rel_dom; i; --i, a++)
a->att_type = 0;
i = rel_tup.relatts;
while (i && !AAam_get(d, &tid1, &tid2, &dom_tup, TRUE))
{
/* does this attribute belong ? */
if (AAkcompare(d, &dom_tup, &dom_key))
continue;
/* yes, it belongs */
if (dom_tup.attid < 1 || dom_tup.attid > rel_tup.relatts)
yyexit(24, dom_tup.attid, rel);
j = dom_tup.attid;
a = &r->rel_dom[j - 1];
if (a->att_type)
yyexit(23, dom_tup.attid, rel);
AAbmove(dom_tup.attname, p = a->att_name, MAXNAME);
a->att_name[MAXNAME] = ' ';
while (*p != ' ')
p++;
*p = '\0';
a->att_id = dom_tup.attid;
a->att_key = dom_tup.attxtra;
switch (dom_tup.attfrmt)
{
case INT:
if (dom_tup.attfrml == sizeof (char))
a->att_type = opCHAR;
else if (dom_tup.attfrml == sizeof (short))
a->att_type = opINT;
else
a->att_type = opLONG;
break;
case FLOAT:
# ifndef NO_F4
if (dom_tup.attfrml == sizeof (float))
a->att_type = opFLT;
else
# endif
a->att_type = opDOUBLE;
break;
default:
a->att_type = opSTRING;
}
a->att_len = dom_tup.attfrml;
a->att_off = dom_tup.attoff;
--i;
}
if (i)
yyexit(21, i, rel);
/* create the global relation pointer */
swaprel(r, write);
r = getrel(r->rel_uniq, 1);
Temp_rel[0].rel_uniq = MAX_RELS;
# ifdef AMX_SC
fprintf(FILE_amx, msg(168 + decl), r->rel_uniq);
fprintf(FILE_amx, msg(170 + decl), r->rel_uniq, r->rel_id);
# else
fprintf(FILE_amx, msg(168), r->rel_uniq);
fprintf(FILE_amx, msg(170), r->rel_uniq, r->rel_id);
# endif
Relation = r;
}