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 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_ */

View File

@ -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

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 rows;
@ -64,9 +64,10 @@ for (j=offset;j<offset+32;j++)
fprintf(stdout,"\n");
*/
memset(entry, '\0', sizeof(MDB_CATALOG_ENTRY));
memset(entry, '\0', sizeof(MdbCatalogEntry));
entry->object_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;i<rows;i++) {
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);
}
}
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;
}

View File

@ -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;
}

View File

@ -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;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 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;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;
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) {
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;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;
}
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 <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"
MDB_HANDLE *mdb_alloc_handle()
MdbHandle *mdb_alloc_handle()
{
MDB_HANDLE *mdb;
MdbHandle *mdb;
mdb = (MDB_HANDLE *) malloc(sizeof(MDB_HANDLE));
memset(mdb, '\0', sizeof(MDB_HANDLE));
mdb = (MdbHandle *) malloc(sizeof(MdbHandle));
memset(mdb, '\0', sizeof(MdbHandle));
return mdb;
}
void mdb_free_handle(MDB_HANDLE *mdb)
void mdb_free_handle(MdbHandle *mdb)
{
if (!mdb) return;
@ -36,10 +36,10 @@ void mdb_free_handle(MDB_HANDLE *mdb)
if (mdb->catalog) 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;

View File

@ -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)

View File

@ -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) {