mirror of
https://github.com/mdbtools/mdbtools.git
synced 2025-07-15 19:47:40 +08:00
more structuring
This commit is contained in:
parent
d4e241606c
commit
fcd8153070
@ -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_ */
|
||||
|
@ -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
|
||||
|
||||
|
@ -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,27 +95,29 @@ 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;
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
151
src/libmdb/kkd.c
151
src/libmdb/kkd.c
@ -25,62 +25,49 @@
|
||||
** KKD structures.
|
||||
*/
|
||||
|
||||
void mdb_kkd_dump(MDB_HANDLE *mdb, int rowid)
|
||||
GArray *mdb_get_column_props(MdbCatalogEntry *entry, int start)
|
||||
{
|
||||
int rows;
|
||||
int kkd_start, kkd_end;
|
||||
int i, j, tmp, pos, row_type, hdrpos=0, datapos=0;
|
||||
int len;
|
||||
int col_type, col_num, val_len;
|
||||
int start;
|
||||
unsigned char c;
|
||||
int i, j=0, pos, cnt=0;
|
||||
int len, tmp, cplen;
|
||||
MdbColumnProp prop;
|
||||
char name[MDB_MAX_OBJ_NAME+1];
|
||||
MdbHandle *mdb = entry->mdb;
|
||||
|
||||
rows = mdb_get_int16(mdb,8);
|
||||
fprintf(stdout,"number of rows = %d\n",rows);
|
||||
kkd_start = mdb_get_int16(mdb,10+rowid*2);
|
||||
fprintf(stdout,"kkd start = %d %04x\n",kkd_start,kkd_start);
|
||||
kkd_end = MDB_PGSIZE;
|
||||
for (i=0;i<rows;i++) {
|
||||
tmp = mdb_get_int16(mdb, 10+i*2);
|
||||
if (tmp<MDB_PGSIZE &&
|
||||
tmp>kkd_start &&
|
||||
tmp<kkd_end) {
|
||||
kkd_end = tmp;
|
||||
}
|
||||
}
|
||||
fprintf(stdout,"kkd end = %d %04x\n",kkd_end,kkd_end);
|
||||
pos = kkd_start + 4; /* 4 = K K D \0 */
|
||||
while (pos < kkd_end) {
|
||||
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==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++);
|
||||
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;
|
||||
for (i=0;i<tmp;i++)
|
||||
fprintf(stdout,"%c",mdb->pg_buf[pos+i]);
|
||||
fprintf(stdout,"\n");
|
||||
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++;
|
||||
}
|
||||
}
|
||||
if (datapos) {
|
||||
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,datapos);
|
||||
pos = datapos + 6;
|
||||
while (pos < datapos+len) {
|
||||
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;
|
||||
@ -102,39 +89,63 @@ unsigned char c;
|
||||
fprintf(stdout," %02x",c);
|
||||
|
||||
}
|
||||
fprintf(stdout,"\n");
|
||||
pos = start + tmp;
|
||||
prop = g_array_index(entry->props,MdbColumnProp,col_num);
|
||||
fprintf(stdout," Property %s",prop.name);
|
||||
fprintf(stdout,"\n");
|
||||
}
|
||||
}
|
||||
return hash;
|
||||
}
|
||||
main(int argc, char **argv)
|
||||
void mdb_kkd_dump(MdbCatalogEntry *entry)
|
||||
{
|
||||
int rows;
|
||||
int i;
|
||||
unsigned char buf[2048];
|
||||
MDB_HANDLE *mdb;
|
||||
MDB_CATALOG_ENTRY entry;
|
||||
int kkd_start, kkd_end;
|
||||
int i, j, tmp, pos, row_type, hdrpos=0, datapos=0;
|
||||
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;
|
||||
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
fprintf(stdout,"kkd start = %d %04x\n",kkd_start,kkd_start);
|
||||
kkd_end = MDB_PGSIZE;
|
||||
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);
|
||||
tmp = mdb_get_int16(mdb, 10+i*2);
|
||||
if (tmp<MDB_PGSIZE &&
|
||||
tmp>kkd_start &&
|
||||
tmp<kkd_end) {
|
||||
kkd_end = tmp;
|
||||
}
|
||||
}
|
||||
fprintf(stdout,"kkd end = %d %04x\n",kkd_end,kkd_end);
|
||||
pos = kkd_start + 4; /* 4 = K K D \0 */
|
||||
while (pos < kkd_end) {
|
||||
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) {
|
||||
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;
|
||||
}
|
||||
|
||||
mdb_free_handle(mdb);
|
||||
if (datapos) {
|
||||
mdb_get_column_def(entry, datapos);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user