P8000/WEGA/contrib/ingres/dbs/src/amx_lib/AArep.c

170 lines
3.2 KiB
C

# include "AA_liba.h"
# define DUP_CHECK 1
# define INVALID_TID 2
static int AArep_code; /* return code of AAam_replace() */
static long AArep_tid; /* TID of AAam_replace() */
static char *AAnew_tuple; /* global primary tuple pointer */
AAreplace(p, rel, tid, ptup, repl)
register DESCXX *p;
char *rel;
register long *tid;
register char *ptup;
register char *repl;
{
# ifdef AMX_TRACE
AAtTfp(7, 0,
# ifdef MSDOS
"replace rel\t`%.10s'\n",
# else
"replace rel\t`%.14s'\n",
# endif
rel);
# endif
errno = 0;
if (!AA_DESC)
AAerror(111, "replace");
if (!p)
AAerror(106, rel);
if (!AA_NOLOCKS && !(p->xx_excl & M_EXCL))
AAerror(22, rel);
AA_on();
AA_TID = *tid;
AArep_tid = *tid;
AA = AArep_code = AAam_replace(p, &AArep_tid, ptup, DUP_CHECK);
# ifdef AM_TRACE
AAtTfp(7, 10, "##AM_REPLACE\t%d\n", AA);
if (AAtTfp(7, 11, "##\t\told"))
AAdumptid(tid);
if (AAtTfp(7, 12, "##\t\tnew"))
AAdumptid(&AArep_tid);
if (AAtTfp(7, 13, "##\t\tnewtup"))
AAprtup(p, ptup);
# endif
if (AA < 0 || AA == INVALID_TID)
AAerror(5, rel);
if (ctoi(p->xx_desc.reldum.relindxd) == SECBASE)
{
AAp_desc = p;
AAold_tuple = AA_STUP;
AAnew_tuple = ptup;
while (p = p->xx_index)
AAsecreplace(p, *repl++);
}
AA_off();
}
AAsecreplace(i, repl)
register DESCXX *i;
register int repl;
{
register char *old_tup;
long tid;
long old_tid;
char itup[MAXTUP];
char ikey[MAXTUP];
# ifdef AMX_TRACE
AAtTfp(8, 0,
# ifdef MSDOS
"replace index\t`%.10s' (%d)\n",
# else
"replace index\t`%.14s' (%d)\n",
# endif
i->xx_desc.reldum.relid, repl);
# endif
errno = 0;
if (AArep_tid == AA_TID) /* identical tid's */
{
if (AArep_code)
{
# ifdef AMX_TRACE
AAtTfp(8, 1, "\t\tidentical\n");
# endif
return; /* identical tuple */
}
else if (repl == '0')
{
# ifdef AMX_TRACE
AAtTfp(8, 2, "\t\tdoms unchanged\n");
# endif
return; /* index domains unchanged */
}
}
AAsectup(ikey, i->xx_indom, &AA_TID);
/* set all keys on index descriptor */
AAbmove(AA_SET_ALL_KEYS, &i->xx_desc.relgiven[1], MAXKEYS + 1);
AA = AAgetequal(i, ikey, itup, &tid);
# ifdef AM_TRACE
AAtTfp(8, 6, "##AM_GETEQUAL\t%d\n", AA);
if (AAtTfp(8, 7, "##\t\told"))
AAdumptid(&tid);
if (AAtTfp(8, 8, "##\t\toldkey"))
AAprkey(i, ikey);
if (AAtTfp(8, 9, "##\t\tnewtup"))
AAprtup(i, itup);
# endif
if (AA)
AAerror(6, i->xx_desc.reldum.relid);
if (AArep_code)
{
# ifdef AMX_TRACE
AAtTfp(8, 3, "\t\tdelete\n");
# endif
AA = AAam_delete(i, &tid);
# ifdef AM_TRACE
AAtTfp(8, 14, "##AM_DELETE\t%d\n", AA);
if (AAtTfp(8, 15, "##\t\told"))
AAdumptid(&tid);
# endif
if (AA)
AAerror(7, i->xx_desc.reldum.relid);
return;
}
# ifdef AMX_TRACE
AAtTfp(8, 4, "\t\treplace\n");
# endif
old_tid = tid;
old_tup = AAold_tuple;
AAold_tuple = AAnew_tuple;
AAsectup(itup, i->xx_indom, &AArep_tid);
AAold_tuple = old_tup;
AA = AAam_replace(i, &tid, itup, DUP_CHECK);
# ifdef AM_TRACE
AAtTfp(8, 10, "##AM_REPLACE\t%d\n", AA);
if (AAtTfp(8, 11, "##\t\told"))
AAdumptid(&old_tid);
if (AAtTfp(8, 12, "##\t\tnew"))
AAdumptid(&tid);
if (AAtTfp(8, 13, "##\t\tnewtup"))
AAprtup(i, itup);
# endif
if (AA < 0 || AA == INVALID_TID)
AAerror(5, i->xx_desc.reldum.relid);
}