more structuring

This commit is contained in:
brianb 2000-02-27 19:24:44 +00:00
parent d4e241606c
commit fcd8153070
8 changed files with 146 additions and 115 deletions

View File

@ -56,25 +56,38 @@ typedef struct {
unsigned int cur_pos; unsigned int cur_pos;
unsigned char pg_buf[MDB_PGSIZE]; unsigned char pg_buf[MDB_PGSIZE];
GList *catalog; GList *catalog;
} MDB_HANDLE; } MdbHandle;
typedef struct { typedef struct {
MdbHandle *mdb;
char object_name[MDB_MAX_OBJ_NAME+1]; char object_name[MDB_MAX_OBJ_NAME+1];
int object_type; int object_type;
unsigned long kkd_pg; unsigned long kkd_pg;
unsigned int kkd_rowid; 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 */ /* mem.c */
extern MDB_HANDLE *mdb_alloc_handle(); extern MdbHandle *mdb_alloc_handle();
extern void mdb_free_handle(MDB_HANDLE *mdb); extern void mdb_free_handle(MdbHandle *mdb);
extern void mdb_free_catalog(MDB_HANDLE *mdb); extern void mdb_free_catalog(MdbHandle *mdb);
extern size_t mdb_read_pg(MDB_HANDLE *mdb, unsigned long pg); extern size_t mdb_read_pg(MdbHandle *mdb, unsigned long pg);
extern int mdb_get_int16(MDB_HANDLE *mdb, int offset); extern int mdb_get_int16(MdbHandle *mdb, int offset);
extern long mdb_get_int32(MDB_HANDLE *mdb, int offset); extern long mdb_get_int32(MdbHandle *mdb, int offset);
extern MDB_HANDLE *mdb_open(char *filename); extern MdbHandle *mdb_open(char *filename);
extern void mdb_catalog_dump(MDB_HANDLE *mdb, int obj_type); extern void mdb_catalog_dump(MdbHandle *mdb, int obj_type);
extern int mdb_catalog_rows(MDB_HANDLE *mdb); extern int mdb_catalog_rows(MdbHandle *mdb);
extern MDB_CATALOG_ENTRY *mdb_get_catalog_entry(MDB_HANDLE *mdb, int rowid, MDB_CATALOG_ENTRY *entry); extern MdbCatalogEntry *mdb_get_catalog_entry(MdbHandle *mdb, int rowid, MdbCatalogEntry *entry);
#endif /* _mdbtools_h_ */ #endif /* _mdbtools_h_ */

View File

@ -2,7 +2,7 @@
CC = gcc CC = gcc
INC = -I ../include `glib-config --cflags` INC = -I ../include `glib-config --cflags`
OBJS = catalog.o mem.o file.o OBJS = catalog.o mem.o file.o kkd.o
all: libmdb all: libmdb

View File

@ -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 offset;
int rows; int rows;
@ -64,9 +64,10 @@ for (j=offset;j<offset+32;j++)
fprintf(stdout,"\n"); fprintf(stdout,"\n");
*/ */
memset(entry, '\0', sizeof(MDB_CATALOG_ENTRY)); memset(entry, '\0', sizeof(MdbCatalogEntry));
entry->object_type = mdb->pg_buf[offset+0x09]; entry->object_type = mdb->pg_buf[offset+0x09];
j=0; j=0;
entry->mdb = mdb;
for (i=offset+31;isprint(mdb->pg_buf[i]);i++) { for (i=offset+31;isprint(mdb->pg_buf[i]);i++) {
if (j<=MDB_MAX_OBJ_NAME) { if (j<=MDB_MAX_OBJ_NAME) {
entry->object_name[j++]=mdb->pg_buf[i]; entry->object_name[j++]=mdb->pg_buf[i];
@ -78,15 +79,15 @@ fprintf(stdout,"\n");
return entry; return entry;
} }
int mdb_catalog_rows(MDB_HANDLE *mdb) int mdb_catalog_rows(MdbHandle *mdb)
{ {
return mdb_get_int16(mdb, 0x08); 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 i;
int rows; int rows;
MDB_CATALOG_ENTRY entry; MdbCatalogEntry entry;
gpointer data; gpointer data;
mdb_read_pg(mdb, MDB_CATALOG_PG); mdb_read_pg(mdb, MDB_CATALOG_PG);
@ -94,26 +95,28 @@ gpointer data;
mdb_free_catalog(mdb); mdb_free_catalog(mdb);
for (i=0;i<rows;i++) { for (i=0;i<rows;i++) {
if (mdb_catalog_entry(mdb, i, &entry)) { if (mdb_catalog_entry(mdb, i, &entry)) {
data = g_memdup(&entry,sizeof(MDB_CATALOG_ENTRY)); data = g_memdup(&entry,sizeof(MdbCatalogEntry));
mdb->catalog = g_list_append(mdb->catalog, data); mdb->catalog = g_list_append(mdb->catalog, data);
} }
} }
return (mdb->catalog); return (mdb->catalog);
} }
void mdb_dump_catalog(MDB_HANDLE *mdb, int obj_type) void mdb_dump_catalog(MdbHandle *mdb, int obj_type)
{ {
int rows; int rows;
GList *l; GList *l;
MDB_CATALOG_ENTRY *entryp; MdbCatalogEntry *entryp;
mdb_read_catalog(mdb, obj_type); mdb_read_catalog(mdb, obj_type);
for (l=g_list_first(mdb->catalog);l;l=g_list_next(l)) { for (l=g_list_first(mdb->catalog);l;l=g_list_next(l)) {
entryp = l->data; 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), mdb_get_objtype_string(entryp->object_type),
entryp->object_name, entryp->object_name,
entryp->kkd_pg, entryp->kkd_pg,
entryp->kkd_rowid); entryp->kkd_rowid);
}
} }
return; return;
} }

View File

@ -19,9 +19,9 @@
#include "mdbtools.h" #include "mdbtools.h"
MDB_HANDLE *mdb_open(char *filename) MdbHandle *mdb_open(char *filename)
{ {
MDB_HANDLE *mdb; MdbHandle *mdb;
mdb = mdb_alloc_handle(); mdb = mdb_alloc_handle();
mdb->filename = (char *) malloc(strlen(filename)+1); 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 ** 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; size_t len;
off_t offset = pg * MDB_PGSIZE; off_t offset = pg * MDB_PGSIZE;
@ -62,7 +62,7 @@ struct stat status;
} }
return len; return len;
} }
int mdb_get_int16(MDB_HANDLE *mdb, int offset) int mdb_get_int16(MdbHandle *mdb, int offset)
{ {
unsigned char *c; unsigned char *c;
int i; int i;
@ -75,7 +75,7 @@ int i;
return i; return i;
} }
long mdb_get_int32(MDB_HANDLE *mdb, int offset) long mdb_get_int32(MdbHandle *mdb, int offset)
{ {
long l; long l;
unsigned char *c; unsigned char *c;
@ -90,14 +90,14 @@ unsigned char *c;
mdb->cur_pos+=4; mdb->cur_pos+=4;
return l; 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; if (pos<0 || pos >= MDB_PGSIZE) return 0;
mdb->cur_pos=pos; mdb->cur_pos=pos;
return pos; return pos;
} }
int mdb_get_pos(MDB_HANDLE *mdb) int mdb_get_pos(MdbHandle *mdb)
{ {
return mdb->cur_pos; return mdb->cur_pos;
} }

View File

@ -25,7 +25,78 @@
** KKD structures. ** 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;i<val_len;i++) {
c = mdb->pg_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 rows;
int kkd_start, kkd_end; int kkd_start, kkd_end;
@ -34,7 +105,13 @@ int len;
int col_type, col_num, val_len; int col_type, col_num, val_len;
int start; int start;
unsigned char c; 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); rows = mdb_get_int16(mdb,8);
fprintf(stdout,"number of rows = %d\n",rows); fprintf(stdout,"number of rows = %d\n",rows);
kkd_start = mdb_get_int16(mdb,10+rowid*2); kkd_start = mdb_get_int16(mdb,10+rowid*2);
@ -54,87 +131,21 @@ unsigned char c;
tmp = mdb_get_int16(mdb,pos); tmp = mdb_get_int16(mdb,pos);
row_type = mdb_get_int16(mdb,pos+4); row_type = mdb_get_int16(mdb,pos+4);
fprintf(stdout,"row size = %3d type = 0x%02x\n",tmp,row_type); 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;i<entry->num_props;i++) {
prop = g_array_index(entry->props,MdbColumnProp,i);
fprintf(stdout,"%3d %s\n",i,prop.name);
}
}
if (row_type==0x01) datapos = pos; if (row_type==0x01) datapos = pos;
pos += tmp; 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;i<tmp;i++)
fprintf(stdout,"%c",mdb->pg_buf[pos+i]);
fprintf(stdout,"\n");
pos += tmp;
}
}
if (datapos) { if (datapos) {
fprintf(stdout,"\n data\n"); mdb_get_column_def(entry, datapos);
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;i<val_len;i++) {
c = mdb->pg_buf[pos+i];
if (isprint(c))
fprintf(stdout," %c",c);
else
fprintf(stdout," %02x",c);
}
fprintf(stdout,"\n");
pos = start + tmp;
}
} }
} }
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 <file> <table>\n");
exit(1);
}
mdb = mdb_open(argv[1]);
mdb_read_pg(mdb, MDB_CATALOG_PG);
rows = mdb_catalog_rows(mdb);
for (i=0;i<rows;i++) {
if (mdb_catalog_entry(mdb, i, &entry)) {
if (!strcmp(entry.object_name,argv[2])) {
mdb_read_pg(mdb, entry.kkd_pg);
mdb_kkd_dump(mdb, entry.kkd_rowid);
}
}
}
mdb_free_handle(mdb);
}

View File

@ -19,16 +19,16 @@
#include "mdbtools.h" #include "mdbtools.h"
MDB_HANDLE *mdb_alloc_handle() MdbHandle *mdb_alloc_handle()
{ {
MDB_HANDLE *mdb; MdbHandle *mdb;
mdb = (MDB_HANDLE *) malloc(sizeof(MDB_HANDLE)); mdb = (MdbHandle *) malloc(sizeof(MdbHandle));
memset(mdb, '\0', sizeof(MDB_HANDLE)); memset(mdb, '\0', sizeof(MdbHandle));
return mdb; return mdb;
} }
void mdb_free_handle(MDB_HANDLE *mdb) void mdb_free_handle(MdbHandle *mdb)
{ {
if (!mdb) return; if (!mdb) return;
@ -36,10 +36,10 @@ void mdb_free_handle(MDB_HANDLE *mdb)
if (mdb->catalog) mdb_free_catalog(mdb); if (mdb->catalog) mdb_free_catalog(mdb);
free(mdb); free(mdb);
} }
void mdb_free_catalog(MDB_HANDLE *mdb) void mdb_free_catalog(MdbHandle *mdb)
{ {
GList *l; GList *l;
MDB_CATALOG_ENTRY *entryp; MdbCatalogEntry *entryp;
for (l=g_list_first(mdb->catalog);l;l=g_list_next(l)) { for (l=g_list_first(mdb->catalog);l;l=g_list_next(l)) {
entryp = l->data; entryp = l->data;

View File

@ -3,14 +3,18 @@ CC = gcc
INC = -I ../include `glib-config --cflags` INC = -I ../include `glib-config --cflags`
LIBS = -L ../libmdb -lmdb `glib-config --libs` LIBS = -L ../libmdb -lmdb `glib-config --libs`
PROGS = prcat PROGS = prcat prtable
PRCATOBJS = prcat.o PRCATOBJS = prcat.o
PRTABLEOBJS = prtable.o
all: $(PROGS) all: $(PROGS)
prcat: $(PRCATOBJS) prcat: $(PRCATOBJS)
$(CC) -g -o $@ $(PRCATOBJS) $(LIBS) $(CC) -g -o $@ $(PRCATOBJS) $(LIBS)
prtable: $(PRTABLEOBJS)
$(CC) -g -o $@ $(PRTABLEOBJS) $(LIBS)
clean: clean:
rm -f core *.o $(PROGS) rm -f core *.o $(PROGS)

View File

@ -28,7 +28,7 @@ short digit;
struct stat status; struct stat status;
int rows, cur, off; int rows, cur, off;
unsigned char buf[2048]; unsigned char buf[2048];
MDB_HANDLE *mdb; MdbHandle *mdb;
if (argc<2) { if (argc<2) {