diff --git a/WEGA/contrib/ingres/dbs/src/redabas/rdb.c b/WEGA/contrib/ingres/dbs/src/redabas/rdb.c new file mode 100644 index 0000000..b9734df --- /dev/null +++ b/WEGA/contrib/ingres/dbs/src/redabas/rdb.c @@ -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); }