This commit is contained in:
Oliver Lehmann 1989-12-19 14:32:23 +00:00
parent 6e9ad65d07
commit 10dfba6848
1 changed files with 464 additions and 0 deletions

View File

@ -0,0 +1,464 @@
/*
** J. Wenzlaff, ZKI der AdW
**
** REDABAS -- creation of DB relations from REDABAS data base
*/
# include "db.h"
# ifdef MSDOS
# include "../h/aux#.h"
# else
# include "../h/aux.h"
# endif
# ifdef P8000
ret_buf AAjmp_buf;
# else
jmp_buf AAjmp_buf;
# endif
struct admin AAdmin;
static char Tuple[MAXTUP]; /* tuple buffer */
# ifdef MSDOS
char *Database;
char *Fileset;
extern char *mkfileset();
# endif
extern char *N_db; /* overwrinting for DB */
extern char *N_dbd; /* overwrinting for RDABAS.DBD */
# define VERBOSE 50
extern char *Parmvect[];
extern char *Flagvect[];
# ifdef MSDOS
extern char *AAdbpath[];
# else
extern char *AAdbpath;
# endif
# define DBI_PARM Parmvect[0]
main(argc, argv)
int argc;
char *argv[];
{
register int i;
register char **av;
register char *p;
extern char *AAproc_name;
# ifdef SETBUF
char buf[BUFSIZ];
setbuf(stdout, buf);
# endif
# ifdef xSTR1
AAtTrace(&argc, argv, 'X');
# endif
AAproc_name = *argv;
# ifdef MSDOS
Fileset = mkfileset();
# endif
i = initucode(argc, argv, 0, (char **) 0, M_SHARE);
switch (i)
{
case 0:
break;
case 3:
AAsyserr(0, "REDABAS\tSie sind kein eingetragener %s-Nutzer", USERDBS);
default:
AAsyserr(22200, AAproc_name, i);
}
# ifdef MSDOS
Database = Parmvect[0];
# endif
i = 0;
for (av = Flagvect; p = *av; av++)
{
if (p[0] != '-')
goto badflag;
switch (p[1])
{
case CMD_DBD:
N_dbd = &p[2];
break;
case 'i':
case 'I':
N_db = &p[2];
break;
case 'r':
case 'R':
switch (p[2])
{
case 'd':
case 'D':
List_rec = 1;
break;
case 'v':
case 'V':
List_rec = 2;
break;
default:
goto badflag;
}
break;
default:
badflag:
printf("REDABAS\tUnbekanntes Flag '%s'\n", p);
i++;
}
}
if (i)
goto usage;
if (!DBI_PARM)
{
usage:
printf("usage:\t%s [flags] dbi\n", *argv);
printf("flags:\t-%cdbd change DBD-file-name\n", CMD_DBD);
printf("\t-idb change DB-name\n");
printf("\t-rd transfer deleted records\n");
printf("\t-rv transfer valid records\n");
goto term;
}
RW_flag = CMD_READ;
dbi(DBI_PARM);
term:
fflush(stdout);
return (0);
}
/*
** TRANSFER read REDABAS records into DATABASE
** return (0) = ok
** return (1) = error
*/
transfer(rels)
register int rels;
{
register int i;
register int verb;
if (!rels)
return (0);
if (!(verb = (Db_hdr.db_records + VERBOSE - 1) / VERBOSE))
verb = 1;
printf("|--------------------------------------------------|\n");
printf("| %5d records per \".\" |\n", verb);
printf("|--------------------------------------------------|\n");
fflush(stdout);
while (rdrec())
{
if (!(Recno % verb))
{
putchar('.');
fflush(stdout);
}
if (List_rec)
{
if (*Record == DB_RECVAL)
{
if (List_rec == 1)
continue;
}
else if (List_rec == 2)
continue;
}
for (i = 0; i < rels; i++)
if (put_tup(&Desc_s[i], &Refs[i * MAXDOM]))
return (1);
}
printf("\n|__________________________________________________|\n");
fflush(stdout);
return (0);
}
/*
** PUT_TUP convert REDABAS record into DATABASE tuple
** return (0) = ok
** return (1) = error
*/
put_tup(d, r)
register DESC *d;
register short *r;
{
register struct db_fld *f;
register int i;
long tid;
clr_rec(d);
for (i = 1; i <= d->reldum.relatts; i++)
{
if (*(++r) < 0)
continue; /* domain not filled */
f = &Db_fld[*r];
if (conv(f->db_f_adr, /* ptr to input chars */
f->db_f_type, /* source format */
ctou(f->db_f_len), /* source length */
d->relfrmt[i], /* destination format */
ctou(d->relfrml[i]), /* destination length */
d->reloff[i])) /* destination offset */
{
printf("REDABAS\ton FIELD %d / DOMAIN %d\n", *r, i);
return (1);
}
}
AAam_insert(d, &tid, Tuple, 1);
return (0);
}
/*
** CLR_REC create a fresh REDABAS record
*/
clr_rec(d)
register DESC *d;
{
register int i;
register int len;
register char *off;
register int c;
for (i = d->reldum.relatts; i; --i)
{
len = ctou(d->relfrml[i]);
off = Tuple + d->reloff[i];
c = d->relfrmt[i] == CHAR? ' ': 0;
do *off++ = c; while (--len);
}
}
/*
** CONV copies data from Record into Tuple
** doing conversions whenever necessary
** return (0) = ok
** return (1) = error
*/
conv(in, sf, sl, df, dl, doff)
register char *in; /* pointer to input chars */
register int sf; /* source format */
register int sl; /* source length */
register int df; /* destination format */
register int dl; /* destination length */
register int doff; /* destination offset */
{
char any[sizeof (double)];
char c0_temp[MAXFIELD];
extern long atol();
switch (sf)
{
# if (REDABAS == 3)
case TYPE_MEMO:
goto conv_err;
# endif
case TYPE_CHAR:
if (df != CHAR)
goto conv_err;
if (dl > sl)
dl = sl;
break;
case TYPE_LOG:
if (sl != 1)
{
type_err:
printf("\n\tunknown type %c%d\n", sf, sl);
return (1);
}
if (df != CHAR || dl != 1)
{
conv_err:
printf("\n\tcan't convert type %c%d to type %c%d\n",
sf, sl, typeunconv(df), dl);
return (1);
}
break;
case TYPE_DATE:
if (sl != 8)
goto type_err;
if (df != CHAR || dl != 8)
goto conv_err;
break;
case TYPE_INT:
if (df != INT || dl != sizeof (long))
goto conv_err;
break;
case TYPE_NUM:
AAbmove(in, c0_temp, sl);
c0_temp[sl] = 0;
switch (df)
{
case FLOAT:
AA_atof(c0_temp, any);
switch (dl)
{
# ifndef NO_F4
case sizeof (float):
((F4TYPE *) any)->f4type = ((F8TYPE *) any)->f8type;
break;
# endif
case sizeof (double):
break;
default:
goto conv_err;
}
break;
case INT:
((I4TYPE *) any)->i4type = atol(c0_temp);
switch (dl)
{
case sizeof (char):
((I1TYPE *) any)->i1type = ((I4TYPE *) any)->i4type;
break;
case sizeof (short):
((I2TYPE *) any)->i2type = ((I4TYPE *) any)->i4type;
break;
case sizeof (long):
break;
default:
goto conv_err;
}
break;
default:
goto conv_err;
}
in = any;
break;
default:
goto conv_err;
}
AAbmove(in, &Tuple[doff], dl);
return (0);
}
/*
** BGN_FLD start of field check
** return (0) = ok
** return (1) = error
*/
bgn_fld(argc, argv)
int argc;
register char **argv;
{
register int i;
if (!argc)
{
printf("\tmissing DBD-file-name\n");
return (1);
}
if (rdhdr(argv[PTR_NAME]) || rdopen(argv[PTR_NAME]))
return (1);
/* clear field check area */
for (i = 0; i < DB_FLDMAX + 2; i++)
Flds[i] = 0;
return (0);
}
/*
** CHK_FLD field check
** return (0) = ok
** return (1) = error
*/
chk_fld(argc, argv)
int argc;
register char **argv;
{
register int i;
register struct db_fld *f;
register int l;
if (argc < 2)
{
printf("\tmissing FIELD-n%s\n", argc? "ame": "umber");
return (1);
}
if ((i = atoi(argv[PTR_NAME])) >= Db_hdr.db_fields || i < 0)
{
printf("\tillegal FIELD-number %d\n", i);
return (1);
}
if (Flds[i])
{
printf("\tduplicate FIELD-number %d\n", i);
return (1);
}
Flds[i] = 1;
if (!i)
return (0);
if (argc < 3)
{
printf("\tmissing type & length on FIELD %d\n", i);
return (1);
}
if ((f = &Db_fld[i])->db_f_type != *(argv[PTR_TYPE]))
{
printf("\ttype error on FIELD %d\n", i);
printf("\texpected %c\n", f->db_f_type);
printf("\t found %c\n", *(argv[PTR_TYPE]));
return (1);
}
if (ctou(f->db_f_len) != (l = atoi(argv[PTR_TYPE] + 1)))
{
printf("\tlength error on FIELD %d\n", i);
printf("\texpected %d\n", ctou(f->db_f_len));
printf("\t found %d\n", l);
return (1);
}
l = (argc > 3)? atoi(argv[PTR_DEC]): 0;
if (l != f->db_f_dec)
{
printf("\tpoint error on FIELD %d\n", i);
printf("\texpected %d\n", f->db_f_dec);
printf("\t found %d\n", l);
return (1);
}
return (0);
}
/*
** END_FLD end of field check
** return (0) = ok
** return (1) = error
*/
end_fld()
{
register int i;
for (i = 0; i < DB_FLDMAX + 2; i++)
if (!Flds[i])
break;
if (i != Db_hdr.db_fields)
{
printf("\tmissing FIELD with number %d\n", i);
return (1);
}
return (0);
}
/*
** SEVERAL replacement routines
*/
rubproc() { fflush(stdout); exit(1); }