From fcd8153070ebaeeace8499e7bc22db5d8597a855 Mon Sep 17 00:00:00 2001 From: brianb Date: Sun, 27 Feb 2000 19:24:44 +0000 Subject: [PATCH] more structuring --- src/include/mdbtools.h | 37 ++++++--- src/libmdb/Makefile | 2 +- src/libmdb/catalog.c | 21 +++--- src/libmdb/file.c | 14 ++-- src/libmdb/kkd.c | 165 ++++++++++++++++++++++------------------- src/libmdb/mem.c | 14 ++-- src/util/Makefile | 6 +- src/util/prcat.c | 2 +- 8 files changed, 146 insertions(+), 115 deletions(-) diff --git a/src/include/mdbtools.h b/src/include/mdbtools.h index 7c53a85..cec17ab 100644 --- a/src/include/mdbtools.h +++ b/src/include/mdbtools.h @@ -56,25 +56,38 @@ typedef struct { unsigned int cur_pos; unsigned char pg_buf[MDB_PGSIZE]; GList *catalog; -} MDB_HANDLE; +} MdbHandle; typedef struct { + MdbHandle *mdb; char object_name[MDB_MAX_OBJ_NAME+1]; int object_type; unsigned long kkd_pg; unsigned int kkd_rowid; -} MDB_CATALOG_ENTRY; + int num_props; + GArray *props; + GArray *columns; +} MdbCatalogEntry; + +typedef struct { + char name[MDB_MAX_OBJ_NAME+1]; +} MdbColumnProp; + +typedef struct { + char name[MDB_MAX_OBJ_NAME+1]; + GHashTable *properties; +} MdbColumn; /* mem.c */ -extern MDB_HANDLE *mdb_alloc_handle(); -extern void mdb_free_handle(MDB_HANDLE *mdb); -extern void mdb_free_catalog(MDB_HANDLE *mdb); +extern MdbHandle *mdb_alloc_handle(); +extern void mdb_free_handle(MdbHandle *mdb); +extern void mdb_free_catalog(MdbHandle *mdb); -extern size_t mdb_read_pg(MDB_HANDLE *mdb, unsigned long pg); -extern int mdb_get_int16(MDB_HANDLE *mdb, int offset); -extern long mdb_get_int32(MDB_HANDLE *mdb, int offset); -extern MDB_HANDLE *mdb_open(char *filename); -extern void mdb_catalog_dump(MDB_HANDLE *mdb, int obj_type); -extern int mdb_catalog_rows(MDB_HANDLE *mdb); -extern MDB_CATALOG_ENTRY *mdb_get_catalog_entry(MDB_HANDLE *mdb, int rowid, MDB_CATALOG_ENTRY *entry); +extern size_t mdb_read_pg(MdbHandle *mdb, unsigned long pg); +extern int mdb_get_int16(MdbHandle *mdb, int offset); +extern long mdb_get_int32(MdbHandle *mdb, int offset); +extern MdbHandle *mdb_open(char *filename); +extern void mdb_catalog_dump(MdbHandle *mdb, int obj_type); +extern int mdb_catalog_rows(MdbHandle *mdb); +extern MdbCatalogEntry *mdb_get_catalog_entry(MdbHandle *mdb, int rowid, MdbCatalogEntry *entry); #endif /* _mdbtools_h_ */ diff --git a/src/libmdb/Makefile b/src/libmdb/Makefile index 918a5a5..159cae3 100644 --- a/src/libmdb/Makefile +++ b/src/libmdb/Makefile @@ -2,7 +2,7 @@ CC = gcc INC = -I ../include `glib-config --cflags` -OBJS = catalog.o mem.o file.o +OBJS = catalog.o mem.o file.o kkd.o all: libmdb diff --git a/src/libmdb/catalog.c b/src/libmdb/catalog.c index 9918d5d..99937cb 100644 --- a/src/libmdb/catalog.c +++ b/src/libmdb/catalog.c @@ -42,7 +42,7 @@ static char *type_name[] = {"Form", } } -MDB_CATALOG_ENTRY *mdb_catalog_entry(MDB_HANDLE *mdb, int rowid, MDB_CATALOG_ENTRY *entry) +MdbCatalogEntry *mdb_catalog_entry(MdbHandle *mdb, int rowid, MdbCatalogEntry *entry) { int offset; int rows; @@ -64,9 +64,10 @@ for (j=offset;jobject_type = mdb->pg_buf[offset+0x09]; j=0; + entry->mdb = mdb; for (i=offset+31;isprint(mdb->pg_buf[i]);i++) { if (j<=MDB_MAX_OBJ_NAME) { entry->object_name[j++]=mdb->pg_buf[i]; @@ -78,15 +79,15 @@ fprintf(stdout,"\n"); return entry; } -int mdb_catalog_rows(MDB_HANDLE *mdb) +int mdb_catalog_rows(MdbHandle *mdb) { return mdb_get_int16(mdb, 0x08); } -GList *mdb_read_catalog(MDB_HANDLE *mdb, int obj_type) +GList *mdb_read_catalog(MdbHandle *mdb, int obj_type) { int i; int rows; -MDB_CATALOG_ENTRY entry; +MdbCatalogEntry entry; gpointer data; mdb_read_pg(mdb, MDB_CATALOG_PG); @@ -94,26 +95,28 @@ gpointer data; mdb_free_catalog(mdb); for (i=0;icatalog = g_list_append(mdb->catalog, data); } } return (mdb->catalog); } -void mdb_dump_catalog(MDB_HANDLE *mdb, int obj_type) +void mdb_dump_catalog(MdbHandle *mdb, int obj_type) { int rows; GList *l; -MDB_CATALOG_ENTRY *entryp; +MdbCatalogEntry *entryp; mdb_read_catalog(mdb, obj_type); for (l=g_list_first(mdb->catalog);l;l=g_list_next(l)) { entryp = l->data; - fprintf(stdout,"Type: %-15s Name: %-30s KKD pg: %04x row: %2d\n", + if (obj_type==-1 || entryp->object_type==obj_type) { + fprintf(stdout,"Type: %-15s Name: %-30s KKD pg: %04x row: %2d\n", mdb_get_objtype_string(entryp->object_type), entryp->object_name, entryp->kkd_pg, entryp->kkd_rowid); + } } return; } diff --git a/src/libmdb/file.c b/src/libmdb/file.c index da73740..ef0e154 100644 --- a/src/libmdb/file.c +++ b/src/libmdb/file.c @@ -19,9 +19,9 @@ #include "mdbtools.h" -MDB_HANDLE *mdb_open(char *filename) +MdbHandle *mdb_open(char *filename) { -MDB_HANDLE *mdb; +MdbHandle *mdb; mdb = mdb_alloc_handle(); mdb->filename = (char *) malloc(strlen(filename)+1); @@ -39,7 +39,7 @@ MDB_HANDLE *mdb; /* ** mdb_read a wrapper for read that bails if anything is wrong */ -size_t mdb_read_pg(MDB_HANDLE *mdb, unsigned long pg) +size_t mdb_read_pg(MdbHandle *mdb, unsigned long pg) { size_t len; off_t offset = pg * MDB_PGSIZE; @@ -62,7 +62,7 @@ struct stat status; } return len; } -int mdb_get_int16(MDB_HANDLE *mdb, int offset) +int mdb_get_int16(MdbHandle *mdb, int offset) { unsigned char *c; int i; @@ -75,7 +75,7 @@ int i; return i; } -long mdb_get_int32(MDB_HANDLE *mdb, int offset) +long mdb_get_int32(MdbHandle *mdb, int offset) { long l; unsigned char *c; @@ -90,14 +90,14 @@ unsigned char *c; mdb->cur_pos+=4; return l; } -int mdb_set_pos(MDB_HANDLE *mdb, int pos) +int mdb_set_pos(MdbHandle *mdb, int pos) { if (pos<0 || pos >= MDB_PGSIZE) return 0; mdb->cur_pos=pos; return pos; } -int mdb_get_pos(MDB_HANDLE *mdb) +int mdb_get_pos(MdbHandle *mdb) { return mdb->cur_pos; } diff --git a/src/libmdb/kkd.c b/src/libmdb/kkd.c index 90e0c2e..ab0ee3f 100644 --- a/src/libmdb/kkd.c +++ b/src/libmdb/kkd.c @@ -25,7 +25,78 @@ ** KKD structures. */ -void mdb_kkd_dump(MDB_HANDLE *mdb, int rowid) +GArray *mdb_get_column_props(MdbCatalogEntry *entry, int start) +{ +int i, j=0, pos, cnt=0; +int len, tmp, cplen; +MdbColumnProp prop; +char name[MDB_MAX_OBJ_NAME+1]; +MdbHandle *mdb = entry->mdb; + + entry->props = g_array_new(FALSE,FALSE,sizeof(MdbColumnProp)); + len = mdb_get_int16(mdb,start); + pos = start + 6; + while (pos < start+len) { + tmp = mdb_get_int16(mdb,pos); /* length of string */ + pos += 2; + cplen = tmp > MDB_MAX_OBJ_NAME ? MDB_MAX_OBJ_NAME : tmp; + g_memmove(prop.name,&mdb->pg_buf[pos],cplen); + prop.name[cplen]='\0'; + pos += tmp; + g_array_append_val(entry->props, prop.name); + cnt++; + } + entry->num_props = cnt; + return entry->props; +} + +GHashTable *mdb_get_column_def(MdbCatalogEntry *entry, int start) +{ +GHashTable *hash; +MdbHandle *mdb = entry->mdb; +MdbColumnProp prop; +int tmp, pos, col_num, val_len, i; +int len, col_type; +unsigned char c; +int end; + + fprintf(stdout,"\n data\n"); + fprintf(stdout,"-------\n"); + len = mdb_get_int16(mdb,start); + fprintf(stdout,"length = %3d\n",len); + pos = start + 6; + end = start + len; + while (pos < end) { + fprintf(stdout,"pos = %3d\n",pos); + start = pos; + tmp = mdb_get_int16(mdb,pos); /* length of field */ + pos += 2; + col_type = mdb_get_int16(mdb,pos); /* ??? */ + pos += 2; + col_num = 0; + if (col_type) { + col_num = mdb_get_int16(mdb,pos); + pos += 2; + } + val_len = mdb_get_int16(mdb,pos); + pos += 2; + fprintf(stdout,"length = %3d %04x %2d %2d ",tmp, col_type, col_num, val_len); + for (i=0;ipg_buf[pos+i]; + if (isprint(c)) + fprintf(stdout," %c",c); + else + fprintf(stdout," %02x",c); + + } + pos = start + tmp; + prop = g_array_index(entry->props,MdbColumnProp,col_num); + fprintf(stdout," Property %s",prop.name); + fprintf(stdout,"\n"); + } + return hash; +} +void mdb_kkd_dump(MdbCatalogEntry *entry) { int rows; int kkd_start, kkd_end; @@ -34,7 +105,13 @@ int len; int col_type, col_num, val_len; int start; unsigned char c; +MdbColumnProp prop; +char name[MDB_MAX_OBJ_NAME+1]; +MdbHandle *mdb = entry->mdb; +int rowid = entry->kkd_rowid; + + mdb_read_pg(mdb, entry->kkd_pg); rows = mdb_get_int16(mdb,8); fprintf(stdout,"number of rows = %d\n",rows); kkd_start = mdb_get_int16(mdb,10+rowid*2); @@ -54,87 +131,21 @@ unsigned char c; tmp = mdb_get_int16(mdb,pos); row_type = mdb_get_int16(mdb,pos+4); fprintf(stdout,"row size = %3d type = 0x%02x\n",tmp,row_type); - if (row_type==0x80) hdrpos = pos; + if (row_type==0x80) { + fprintf(stdout,"\nColumn Properties\n"); + fprintf(stdout,"-----------------\n"); + mdb_get_column_props(entry,pos); + for (i=0;inum_props;i++) { + prop = g_array_index(entry->props,MdbColumnProp,i); + fprintf(stdout,"%3d %s\n",i,prop.name); + } + } if (row_type==0x01) datapos = pos; pos += tmp; } - if (hdrpos) { - j=0; - fprintf(stdout,"\nheaders\n"); - fprintf(stdout,"-------\n"); - len = mdb_get_int16(mdb,hdrpos); - pos = hdrpos + 6; - while (pos < hdrpos+len) { - fprintf(stdout,"%3d ",j++); - tmp = mdb_get_int16(mdb,pos); /* length of string */ - pos += 2; - for (i=0;ipg_buf[pos+i]); - fprintf(stdout,"\n"); - pos += tmp; - } - } if (datapos) { - fprintf(stdout,"\n data\n"); - fprintf(stdout,"-------\n"); - len = mdb_get_int16(mdb,datapos); - pos = datapos + 6; - while (pos < datapos+len) { - start = pos; - tmp = mdb_get_int16(mdb,pos); /* length of field */ - pos += 2; - col_type = mdb_get_int16(mdb,pos); /* ??? */ - pos += 2; - col_num = 0; - if (col_type) { - col_num = mdb_get_int16(mdb,pos); - pos += 2; - } - val_len = mdb_get_int16(mdb,pos); - pos += 2; - fprintf(stdout,"length = %3d %04x %2d %2d ",tmp, col_type, col_num, val_len); - for (i=0;ipg_buf[pos+i]; - if (isprint(c)) - fprintf(stdout," %c",c); - else - fprintf(stdout," %02x",c); - - } - fprintf(stdout,"\n"); - pos = start + tmp; - } + mdb_get_column_def(entry, datapos); } } -main(int argc, char **argv) -{ -int rows; -int i; -unsigned char buf[2048]; -MDB_HANDLE *mdb; -MDB_CATALOG_ENTRY entry; - - - if (argc<2) { - fprintf(stderr,"Usage: prtable \n"); - exit(1); - } - - mdb = mdb_open(argv[1]); - - mdb_read_pg(mdb, MDB_CATALOG_PG); - rows = mdb_catalog_rows(mdb); - - for (i=0;icatalog) mdb_free_catalog(mdb); free(mdb); } -void mdb_free_catalog(MDB_HANDLE *mdb) +void mdb_free_catalog(MdbHandle *mdb) { GList *l; -MDB_CATALOG_ENTRY *entryp; +MdbCatalogEntry *entryp; for (l=g_list_first(mdb->catalog);l;l=g_list_next(l)) { entryp = l->data; diff --git a/src/util/Makefile b/src/util/Makefile index 1672e5a..99c4845 100644 --- a/src/util/Makefile +++ b/src/util/Makefile @@ -3,14 +3,18 @@ CC = gcc INC = -I ../include `glib-config --cflags` LIBS = -L ../libmdb -lmdb `glib-config --libs` -PROGS = prcat +PROGS = prcat prtable PRCATOBJS = prcat.o +PRTABLEOBJS = prtable.o all: $(PROGS) prcat: $(PRCATOBJS) $(CC) -g -o $@ $(PRCATOBJS) $(LIBS) +prtable: $(PRTABLEOBJS) + $(CC) -g -o $@ $(PRTABLEOBJS) $(LIBS) + clean: rm -f core *.o $(PROGS) diff --git a/src/util/prcat.c b/src/util/prcat.c index b7b9496..fcdf6d3 100644 --- a/src/util/prcat.c +++ b/src/util/prcat.c @@ -28,7 +28,7 @@ short digit; struct stat status; int rows, cur, off; unsigned char buf[2048]; -MDB_HANDLE *mdb; +MdbHandle *mdb; if (argc<2) {