ING_DB
This commit is contained in:
parent
6e9ad65d07
commit
10dfba6848
|
|
@ -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); }
|
||||||
Loading…
Reference in New Issue