ING_DB
This commit is contained in:
parent
7b5b97e51a
commit
6e9ad65d07
|
|
@ -0,0 +1,274 @@
|
||||||
|
/*
|
||||||
|
** J. Wenzlaff, ZKI der AdW
|
||||||
|
**
|
||||||
|
** READ REDABAS header into Db_hdr
|
||||||
|
** READ REDABAS fields into Db_fld
|
||||||
|
*/
|
||||||
|
|
||||||
|
# include "db.h"
|
||||||
|
# ifdef MSDOS
|
||||||
|
# include <fcntl.h>
|
||||||
|
# endif
|
||||||
|
|
||||||
|
struct db_hdr Db_hdr; /* REDABAS header */
|
||||||
|
struct db_fld Db_fld[DB_FLDMAX + 2]; /* REDABAS fields */
|
||||||
|
char Record[DB_RECMAX + 200];/* REDABAS record */
|
||||||
|
char List_hdr; /* flag to list header */
|
||||||
|
char List_fld; /* flag to list fields */
|
||||||
|
static int R_fd; /* file REDABAS.DBD */
|
||||||
|
|
||||||
|
static int rdshort(buf)
|
||||||
|
register char *buf;
|
||||||
|
{
|
||||||
|
register int w1;
|
||||||
|
register int w2;
|
||||||
|
|
||||||
|
w1 = *buf++ & BYTE_MASK;
|
||||||
|
w2 = *buf & BYTE_MASK;
|
||||||
|
w1 += w2 << BYTE_LOG2;
|
||||||
|
return (w1);
|
||||||
|
}
|
||||||
|
|
||||||
|
# if (REDABAS == 2)
|
||||||
|
# define rdword(buf) rdshort(buf)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# if (REDABAS == 3)
|
||||||
|
static long rdword(buf)
|
||||||
|
register char *buf;
|
||||||
|
{
|
||||||
|
long w1;
|
||||||
|
long w2;
|
||||||
|
|
||||||
|
w1 = rdshort(buf);
|
||||||
|
w1 &= WORD_MASK;
|
||||||
|
w2 = rdshort(buf + sizeof (short));
|
||||||
|
w2 &= WORD_MASK;
|
||||||
|
w1 += w2 << WORD_LOG2;
|
||||||
|
return (w1);
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
** RDHDR open REDABAS.DBD and read head informations
|
||||||
|
** return (0) = ok
|
||||||
|
** return (1) = error
|
||||||
|
*/
|
||||||
|
rdhdr(dbd)
|
||||||
|
register char *dbd;
|
||||||
|
{
|
||||||
|
register struct db_hdr *h;
|
||||||
|
register char *p;
|
||||||
|
register int i;
|
||||||
|
register struct db_fld *f;
|
||||||
|
long recs;
|
||||||
|
char hdr_buf[DB_HDR];
|
||||||
|
|
||||||
|
# ifdef MSDOS
|
||||||
|
if ((R_fd = open(dbd, 0 | O_BINARY)) < 0)
|
||||||
|
# else
|
||||||
|
if ((R_fd = open(dbd, 0)) < 0)
|
||||||
|
# endif
|
||||||
|
{
|
||||||
|
printf("\tcan't access DBD-file %s\n", dbd);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
if (read(R_fd, p = hdr_buf, DB_HDR) != DB_HDR)
|
||||||
|
goto fmt_err;
|
||||||
|
if ((*p & 0177) != REDABAS)
|
||||||
|
{
|
||||||
|
printf("REDABAS\tversion error on DBD-file %s\n", dbd);
|
||||||
|
printf("\texpected REDABAS %d\n", REDABAS);
|
||||||
|
printf("\t found REDABAS %d\n", *p & 0177);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
if (rdfld())
|
||||||
|
{
|
||||||
|
fmt_err:
|
||||||
|
printf("REDABAS\tformat error on DBD-file %s\n", dbd);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
(h = &Db_hdr)->db_records = rdword(&p[DB_RECORDS]);
|
||||||
|
h->db_day = p[DB_DAY];
|
||||||
|
h->db_month = p[DB_MONTH];
|
||||||
|
h->db_year = p[DB_YEAR];
|
||||||
|
h->db_reclen = rdshort(&p[DB_RECLEN]);
|
||||||
|
# if (REDABAS == 2)
|
||||||
|
h->db_hdrlen = DB_HEAD;
|
||||||
|
# endif
|
||||||
|
# if (REDABAS == 3)
|
||||||
|
h->db_hdrlen = rdshort(&p[DB_HDRLEN]);
|
||||||
|
# endif
|
||||||
|
|
||||||
|
if (List_hdr)
|
||||||
|
{
|
||||||
|
printf("\n---- REDABAS -- %d ----\n", REDABAS);
|
||||||
|
printf("| database from file |\t%s\n", dbd);
|
||||||
|
printf("| length of header |\t%d\n", h->db_hdrlen);
|
||||||
|
recs = h->db_records;
|
||||||
|
printf("| number of records |\t%ld\n", recs);
|
||||||
|
printf("| length of record |\t%d\n", h->db_reclen);
|
||||||
|
if (h->db_day && h->db_month && h->db_year)
|
||||||
|
printf("| last modification |\t%d.%d.19%d\n",
|
||||||
|
h->db_day, h->db_month, h->db_year);
|
||||||
|
printf("| number of fields |\t%d\n", h->db_fields);
|
||||||
|
printf("----------------------\n");
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
if (List_fld)
|
||||||
|
{
|
||||||
|
printf("\n--- no --- off --- field --- type --- length --- dec ---");
|
||||||
|
p = Record;
|
||||||
|
for (i = 0, f = Db_fld; i < h->db_fields; i++, f++)
|
||||||
|
{
|
||||||
|
printf("\n|%5d%8d %-10s", i,
|
||||||
|
i? f->db_f_adr - p: 0, f->db_f_name);
|
||||||
|
if (f->db_f_type)
|
||||||
|
{
|
||||||
|
printf(" %c%11d", f->db_f_type, ctou(f->db_f_len));
|
||||||
|
if (f->db_f_dec)
|
||||||
|
printf("%8d", f->db_f_dec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("\n--------------------------------------------------------\n");
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
close(R_fd);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** RDFLD read field informations
|
||||||
|
** return (0) = ok
|
||||||
|
** return (1) = error
|
||||||
|
*/
|
||||||
|
static int rdfld()
|
||||||
|
{
|
||||||
|
register struct db_fld *f;
|
||||||
|
register char *p;
|
||||||
|
register int i;
|
||||||
|
register char *r;
|
||||||
|
register int l;
|
||||||
|
char fld_buf[DB_FLDLEN];
|
||||||
|
|
||||||
|
/* first dummy field: record number */
|
||||||
|
(f = Db_fld)->db_f_adr = (char *) &Recno;
|
||||||
|
f->db_f_name[0] = FLD_RECNO;
|
||||||
|
f->db_f_type = TYPE_INT;
|
||||||
|
f->db_f_len = sizeof (long);
|
||||||
|
|
||||||
|
/* second dummy field: erase mark */
|
||||||
|
(++f)->db_f_adr = r = Record;
|
||||||
|
r++;
|
||||||
|
f->db_f_name[0] = FLD_DELMARK;
|
||||||
|
f->db_f_type = TYPE_CHAR;
|
||||||
|
f->db_f_len = 1;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
p = fld_buf;
|
||||||
|
while ((l = read(R_fd, p, DB_FLDLEN)) > 0)
|
||||||
|
{
|
||||||
|
if (*p == DB_FLDLAST)
|
||||||
|
goto all_fields;
|
||||||
|
if (l != DB_FLDLEN)
|
||||||
|
break;
|
||||||
|
(++f)->db_f_adr = r;
|
||||||
|
r += ctou(p[DB_F_LEN]);
|
||||||
|
AAbmove(&p[DB_F_NAME], f->db_f_name, DBNAME + 1);
|
||||||
|
f->db_f_type = p[DB_F_TYPE];
|
||||||
|
f->db_f_len = p[DB_F_LEN];
|
||||||
|
f->db_f_dec = p[DB_F_DEC];
|
||||||
|
if (++i < DB_FLDMAX)
|
||||||
|
continue;
|
||||||
|
all_fields:
|
||||||
|
Db_hdr.db_fields = i + 2;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** OPEN REDABAS.DBD into R_file
|
||||||
|
** READ REDABAS records into Record
|
||||||
|
*/
|
||||||
|
|
||||||
|
long Recno = -1; /* REDABAS record count */
|
||||||
|
char List_rec; /* flag to list tuples */
|
||||||
|
static FILE *R_file; /* file REDABAS.DBD */
|
||||||
|
|
||||||
|
/*
|
||||||
|
** RDOPEN open REDABAS.DBD
|
||||||
|
** return (0) = ok
|
||||||
|
** return (1) = error
|
||||||
|
*/
|
||||||
|
rdopen(dbd)
|
||||||
|
register char *dbd;
|
||||||
|
{
|
||||||
|
register int reclen;
|
||||||
|
register int i;
|
||||||
|
# ifdef SETBUF
|
||||||
|
static char redabas_buf[BUFSIZ];
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifdef MSDOS
|
||||||
|
if ((R_file = fopen(dbd, "rb")) == (FILE *) 0)
|
||||||
|
# else
|
||||||
|
if ((R_file = fopen(dbd, "r")) == (FILE *) 0)
|
||||||
|
# endif
|
||||||
|
{
|
||||||
|
printf("REDABAS\tcan't access DBD-file %s\n", dbd);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
# ifdef SETBUF
|
||||||
|
setbuf(R_file, redabas_buf);
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* skip REDABAS head information */
|
||||||
|
reclen = Db_hdr.db_reclen;
|
||||||
|
Db_hdr.db_reclen = Db_hdr.db_hdrlen;
|
||||||
|
i = rdrec() == 0;
|
||||||
|
Db_hdr.db_reclen = reclen;
|
||||||
|
return (i);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** RDREC read next record from REDABAS.DBD
|
||||||
|
** return (0) = eof
|
||||||
|
** return (1) = ok
|
||||||
|
*/
|
||||||
|
rdrec()
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
register char *r;
|
||||||
|
register FILE *dbd;
|
||||||
|
register int len;
|
||||||
|
long recs;
|
||||||
|
|
||||||
|
r = Record;
|
||||||
|
dbd = R_file;
|
||||||
|
for (len = 0; len < Db_hdr.db_reclen; len++)
|
||||||
|
{
|
||||||
|
if ((i = getc(dbd)) < 0)
|
||||||
|
{
|
||||||
|
printf("REDABAS\trecord length error\n");
|
||||||
|
printf("\ton record %ld\n", Recno + 1);
|
||||||
|
goto eof;
|
||||||
|
}
|
||||||
|
if (!len && i == DB_RECLAST)
|
||||||
|
{
|
||||||
|
if (Recno != (recs = Db_hdr.db_records))
|
||||||
|
{
|
||||||
|
printf("REDABAS\trecord count error\n");
|
||||||
|
printf("\texpected %ld records\n", recs);
|
||||||
|
printf("\t found %ld records\n", Recno);
|
||||||
|
}
|
||||||
|
eof:
|
||||||
|
fclose(dbd);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
*r++ = i;
|
||||||
|
}
|
||||||
|
Recno++;
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue