Initial changes for Access 2000 files

This commit is contained in:
brianb 2002-02-03 02:49:08 +00:00
parent ea8fd2a6ba
commit 1a96e241d0
19 changed files with 310 additions and 91 deletions

View File

@ -70,7 +70,7 @@ MAKEINFO = makeinfo
NM = /usr/bin/nm -B NM = /usr/bin/nm -B
OBJDUMP = @OBJDUMP@ OBJDUMP = @OBJDUMP@
ODBC = ODBC =
ODBC_INC = /usrl/local/include ODBC_INC = /usr/local/include
PACKAGE = mdbtools PACKAGE = mdbtools
RANLIB = ranlib RANLIB = ranlib
READLINE_LIBS = -lncurses -lreadline READLINE_LIBS = -lncurses -lreadline

View File

@ -70,7 +70,7 @@ MAKEINFO = makeinfo
NM = /usr/bin/nm -B NM = /usr/bin/nm -B
OBJDUMP = @OBJDUMP@ OBJDUMP = @OBJDUMP@
ODBC = ODBC =
ODBC_INC = /usrl/local/include ODBC_INC = /usr/local/include
PACKAGE = mdbtools PACKAGE = mdbtools
RANLIB = ranlib RANLIB = ranlib
READLINE_LIBS = -lncurses -lreadline READLINE_LIBS = -lncurses -lreadline

View File

@ -112,6 +112,17 @@ typedef struct {
char *backend_name; char *backend_name;
/* offset to row count on data pages...version dependant */ /* offset to row count on data pages...version dependant */
guint16 row_count_offset; guint16 row_count_offset;
guint16 tab_num_rows_offset;
guint16 tab_num_cols_offset;
guint16 tab_num_idxs_offset;
guint16 tab_num_ridxs_offset;
guint16 tab_first_dpg_offset;
guint16 tab_cols_start_offset;
guint16 tab_ridx_entry_size;
guint16 col_fixed_offset;
guint16 col_num_offset;
guint16 col_size_offset;
guint16 tab_col_entry_size;
} MdbHandle; } MdbHandle;
typedef struct { typedef struct {
@ -123,7 +134,7 @@ typedef struct {
unsigned int kkd_rowid; unsigned int kkd_rowid;
int num_props; int num_props;
GArray *props; GArray *props;
GPtrArray *columns; GArray *columns;
} MdbCatalogEntry; } MdbCatalogEntry;
typedef struct { typedef struct {
@ -168,6 +179,7 @@ typedef struct {
GPtrArray *sargs; GPtrArray *sargs;
unsigned char is_fixed; unsigned char is_fixed;
int query_order; int query_order;
int col_num;
} MdbColumn; } MdbColumn;
typedef union { typedef union {

View File

@ -70,7 +70,7 @@ MAKEINFO = makeinfo
NM = /usr/bin/nm -B NM = /usr/bin/nm -B
OBJDUMP = @OBJDUMP@ OBJDUMP = @OBJDUMP@
ODBC = ODBC =
ODBC_INC = /usrl/local/include ODBC_INC = /usr/local/include
PACKAGE = mdbtools PACKAGE = mdbtools
RANLIB = ranlib RANLIB = ranlib
READLINE_LIBS = -lncurses -lreadline READLINE_LIBS = -lncurses -lreadline

View File

@ -70,7 +70,7 @@ MAKEINFO = makeinfo
NM = /usr/bin/nm -B NM = /usr/bin/nm -B
OBJDUMP = @OBJDUMP@ OBJDUMP = @OBJDUMP@
ODBC = ODBC =
ODBC_INC = /usrl/local/include ODBC_INC = /usr/local/include
PACKAGE = mdbtools PACKAGE = mdbtools
RANLIB = ranlib RANLIB = ranlib
READLINE_LIBS = -lncurses -lreadline READLINE_LIBS = -lncurses -lreadline
@ -95,7 +95,7 @@ mdb_dump_OBJECTS = mdb-dump.o mdbsupport.o
mdb_dump_LDADD = $(LDADD) mdb_dump_LDADD = $(LDADD)
mdb_dump_DEPENDENCIES = ../libmdb/libmdb.la mdb_dump_DEPENDENCIES = ../libmdb/libmdb.la
mdb_dump_LDFLAGS = mdb_dump_LDFLAGS =
CFLAGS = -g -O2 -DUNIXODBC -DSQL CFLAGS = -g -O2 -DIODBC -DSQL
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC) CCLD = $(CC)

View File

@ -31,7 +31,7 @@ int main(int argc, char **argv)
} }
while (length = fread(data,1,16,in)) { while (length = fread(data,1,16,in)) {
sprintf(addr, "%06x", i); sprintf(addr, "%06x", i);
if (!strcmp(&addr[3],"000") || ! strcmp(&addr[3],"800")) { if (!strcmp(&addr[3],"000") ) { //|| ! strcmp(&addr[3],"800")) {
fprintf(stdout,"-- Page 0x%04x (%d) --\n", pg, pg); fprintf(stdout,"-- Page 0x%04x (%d) --\n", pg, pg);
pg++; pg++;
} }

View File

@ -160,6 +160,7 @@ typedef struct {
GPtrArray *sargs; GPtrArray *sargs;
unsigned char is_fixed; unsigned char is_fixed;
int query_order; int query_order;
int col_num;
} MdbColumn; } MdbColumn;
typedef union { typedef union {

View File

@ -70,7 +70,7 @@ MAKEINFO = makeinfo
NM = /usr/bin/nm -B NM = /usr/bin/nm -B
OBJDUMP = @OBJDUMP@ OBJDUMP = @OBJDUMP@
ODBC = ODBC =
ODBC_INC = /usrl/local/include ODBC_INC = /usr/local/include
PACKAGE = mdbtools PACKAGE = mdbtools
RANLIB = ranlib RANLIB = ranlib
READLINE_LIBS = -lncurses -lreadline READLINE_LIBS = -lncurses -lreadline
@ -94,7 +94,7 @@ libmdb_la_LDFLAGS =
libmdb_la_LIBADD = libmdb_la_LIBADD =
libmdb_la_OBJECTS = catalog.lo mem.lo file.lo kkd.lo table.lo data.lo \ libmdb_la_OBJECTS = catalog.lo mem.lo file.lo kkd.lo table.lo data.lo \
dump.lo backend.lo money.lo sargs.lo index.lo like.lo dump.lo backend.lo money.lo sargs.lo index.lo like.lo
CFLAGS = -g -O2 -DUNIXODBC -DSQL CFLAGS = -g -O2 -DIODBC -DSQL
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC) CCLD = $(CC)

View File

@ -42,6 +42,65 @@ static char *type_name[] = {"Form",
} }
} }
/* new method */
#if 1
GArray *mdb_read_catalog (MdbHandle *mdb, int objtype)
{
int i, j, k;
MdbCatalogEntry entry, msysobj;
MdbTableDef *table;
MdbColumn *col;
char parentid[256];
char objname[256];
char tobjtype[256];
int type;
gpointer data;
mdb_free_catalog(mdb);
mdb_alloc_catalog(mdb);
mdb->num_catalog = 0;
/* dummy up a catalog entry so we may read the table def */
memset(&msysobj, 0, sizeof(MdbCatalogEntry));
msysobj.mdb = mdb;
msysobj.object_type = MDB_TABLE;
msysobj.table_pg = 2;
strcpy(msysobj.object_name, "MSysObjects");
/* mdb_table_dump(&msysobj); */
table = mdb_read_table(&msysobj);
mdb_read_columns(table);
mdb_bind_column(table, 1, parentid);
mdb_bind_column(table, 3, objname);
mdb_bind_column(table, 4, tobjtype);
mdb_rewind_table(table);
while (mdb_fetch_row(table)) {
type = atoi(tobjtype);
if (type == objtype) {
// fprintf(stdout, "parentid: %10ld objtype: %-3d objname: %s\n",
// (atol(parentid) & 0x00FFFFFF), type, objname);
memset(&entry,0,sizeof(entry));
entry.mdb = mdb;
strcpy(entry.object_name, objname);
entry.object_type = type;
entry.table_pg = atol(parentid) & 0x00FFFFFF;
mdb->num_catalog++;
//data = g_memdup(&entry,sizeof(MdbCatalogEntry));
mdb->catalog = g_array_append_val(mdb->catalog, entry);
}
}
//mdb_dump_catalog(mdb, MDB_TABLE);
return mdb->catalog;
}
/* old method */
#else
MdbCatalogEntry *mdb_read_catalog_entry(MdbHandle *mdb, int rowid, MdbCatalogEntry *entry) MdbCatalogEntry *mdb_read_catalog_entry(MdbHandle *mdb, int rowid, MdbCatalogEntry *entry)
{ {
int offset; int offset;
@ -77,6 +136,7 @@ fprintf(stdout,"\n");
if (mdb->jet_version==MDB_VER_JET4) i++; if (mdb->jet_version==MDB_VER_JET4) i++;
} }
//fprintf(stderr,"name: %s type: %d\n",entry->object_name, entry->object_type); //fprintf(stderr,"name: %s type: %d\n",entry->object_name, entry->object_type);
//fprintf(stderr,"cur page: %d row; %d\n", entry->table_pg, rowid);
entry->object_name[j] = '\0'; entry->object_name[j] = '\0';
entry->kkd_pg = mdb_get_int16(mdb,offset+31+strlen(entry->object_name)+7); entry->kkd_pg = mdb_get_int16(mdb,offset+31+strlen(entry->object_name)+7);
entry->kkd_rowid = mdb->pg_buf[offset+31+strlen(entry->object_name)+6]; entry->kkd_rowid = mdb->pg_buf[offset+31+strlen(entry->object_name)+6];
@ -106,7 +166,7 @@ int next_pg, next_pg_off;
** So, we simply read the entire mdb file for pages that start 0x01 0x01 and ** So, we simply read the entire mdb file for pages that start 0x01 0x01 and
** have a 32bit value of 2 (02 00 00 00) in bytes 4-7. ** have a 32bit value of 2 (02 00 00 00) in bytes 4-7.
*/ */
#if 0 /*
next_pg = MDB_CATALOG_PG; next_pg = MDB_CATALOG_PG;
mdb_free_catalog(mdb); mdb_free_catalog(mdb);
mdb->num_catalog = 0; mdb->num_catalog = 0;
@ -129,7 +189,7 @@ int next_pg, next_pg_off;
} }
} }
return (mdb->catalog); return (mdb->catalog);
#endif */
mdb_free_catalog(mdb); mdb_free_catalog(mdb);
mdb->num_catalog = 0; mdb->num_catalog = 0;
@ -144,6 +204,7 @@ int next_pg, next_pg_off;
for (i=0;i<rows;i++) { for (i=0;i<rows;i++) {
if (mdb->pg_buf[11 + 2 * i] & 0x40) continue; if (mdb->pg_buf[11 + 2 * i] & 0x40) continue;
if (mdb_read_catalog_entry(mdb, i, &entry)) { if (mdb_read_catalog_entry(mdb, i, &entry)) {
//printf("page %d\n",next_pg);
mdb->num_catalog++; mdb->num_catalog++;
mdb->catalog = g_array_append_val(mdb->catalog, entry); mdb->catalog = g_array_append_val(mdb->catalog, entry);
} }
@ -152,6 +213,7 @@ int next_pg, next_pg_off;
next_pg++; next_pg++;
} }
} }
#endif
void mdb_dump_catalog(MdbHandle *mdb, int obj_type) void mdb_dump_catalog(MdbHandle *mdb, int obj_type)
{ {
int rows, i; int rows, i;

View File

@ -39,12 +39,19 @@ int mdb_find_end_of_row(MdbHandle *mdb, int row)
{ {
int row_start, row_end, i; int row_start, row_end, i;
/* Search the previous "row start" values for the first non-deleted /* Search the previous "row start" values for the first non-deleted one.
one.
* If we don't find one, then the end of the page is the correct value. * If we don't find one, then the end of the page is the correct value.
*/ */
#if 1
if (row==0) {
row_end = mdb->pg_size - 1;
} else {
row_end = (mdb_get_int16(mdb, ((mdb->row_count_offset + 2) + (row - 1) * 2)) & 0x0FFF) - 1;
}
return row_end;
#else
for (i = row - 1; i >= 0; i--) { for (i = row - 1; i >= 0; i--) {
row_start = mdb_get_int16(mdb, (10 + i * 2)); row_start = mdb_get_int16(mdb, ((mdb->row_count_offset + 2) + i * 2));
if (!(row_start & 0x8000)) { if (!(row_start & 0x8000)) {
break; break;
} }
@ -56,8 +63,8 @@ one.
} else { } else {
row_end = row_start - 1; row_end = row_start - 1;
} }
return row_end; return row_end;
#endif
} }
static int mdb_is_null(unsigned char *null_mask, int col_num) static int mdb_is_null(unsigned char *null_mask, int col_num)
{ {
@ -80,6 +87,9 @@ static int mdb_xfer_bound_bool(MdbHandle *mdb, MdbColumn *col, int value)
} }
static int mdb_xfer_bound_data(MdbHandle *mdb, int start, MdbColumn *col, int len) static int mdb_xfer_bound_data(MdbHandle *mdb, int start, MdbColumn *col, int len)
{ {
//if (!strcmp("Name",col->name)) {
//printf("start %d %d\n",start, len);
//}
if (col->bind_ptr) { if (col->bind_ptr) {
if (len) { if (len) {
strcpy(col->bind_ptr, strcpy(col->bind_ptr,
@ -107,12 +117,12 @@ int bitmask_sz;
unsigned char null_mask[33]; /* 256 columns max / 8 bits per byte */ unsigned char null_mask[33]; /* 256 columns max / 8 bits per byte */
unsigned char isnull; unsigned char isnull;
row_start = mdb_get_int16(mdb, 10+(row*2)); row_start = mdb_get_int16(mdb, (mdb->row_count_offset + 2) + (row*2));
row_end = mdb_find_end_of_row(mdb, row); row_end = mdb_find_end_of_row(mdb, row);
delflag = lookupflag = 0; delflag = lookupflag = 0;
if (row_start & 0x8000) delflag++; if (row_start & 0x8000) lookupflag++;
if (row_start & 0x4000) lookupflag++; if (row_start & 0x4000) delflag++;
row_start &= 0x0FFF; /* remove flags */ row_start &= 0x0FFF; /* remove flags */
#if DEBUG #if DEBUG
fprintf(stdout,"Row %d bytes %d to %d %s %s\n", fprintf(stdout,"Row %d bytes %d to %d %s %s\n",
@ -120,7 +130,8 @@ unsigned char isnull;
lookupflag ? "[lookup]" : "", lookupflag ? "[lookup]" : "",
delflag ? "[delflag]" : ""); delflag ? "[delflag]" : "");
#endif #endif
if (!table->noskip_del && (delflag || lookupflag)) { //if (!table->noskip_del && (delflag || lookupflag)) {
if (!table->noskip_del && delflag) {
row_end = row_start-1; row_end = row_start-1;
return 0; return 0;
} }
@ -130,7 +141,11 @@ unsigned char isnull;
#endif #endif
/* find out all the important stuff about the row */ /* find out all the important stuff about the row */
if (mdb->jet_version==MDB_VER_JET4) {
num_cols = mdb_get_int16(mdb, row_start);
} else {
num_cols = mdb->pg_buf[row_start]; num_cols = mdb->pg_buf[row_start];
}
var_cols = 0; /* mdb->pg_buf[row_end-1]; */ var_cols = 0; /* mdb->pg_buf[row_end-1]; */
fixed_cols = 0; /* num_cols - var_cols; */ fixed_cols = 0; /* num_cols - var_cols; */
for (j = 0; j < table->num_cols; j++) { for (j = 0; j < table->num_cols; j++) {
@ -141,7 +156,11 @@ unsigned char isnull;
var_cols++; var_cols++;
} }
bitmask_sz = (num_cols - 1) / 8 + 1; bitmask_sz = (num_cols - 1) / 8 + 1;
if (mdb->jet_version==MDB_VER_JET4) {
eod = mdb->pg_buf[row_end-2-var_cols*2-bitmask_sz];
} else {
eod = mdb->pg_buf[row_end-1-var_cols-bitmask_sz]; eod = mdb->pg_buf[row_end-1-var_cols-bitmask_sz];
}
for (i=0;i<bitmask_sz;i++) { for (i=0;i<bitmask_sz;i++) {
null_mask[i]=mdb->pg_buf[row_end - bitmask_sz + i + 1]; null_mask[i]=mdb->pg_buf[row_end - bitmask_sz + i + 1];
} }
@ -151,8 +170,12 @@ unsigned char isnull;
num_cols, var_cols, eod); num_cols, var_cols, eod);
#endif #endif
if (mdb->jet_version==MDB_VER_JET4) {
col_start = 2;
} else {
/* data starts at 1 */ /* data starts at 1 */
col_start = 1; col_start = 1;
}
fixed_cols_found = 0; fixed_cols_found = 0;
var_cols_found = 0; var_cols_found = 0;
@ -161,6 +184,11 @@ unsigned char isnull;
col = g_ptr_array_index(table->columns,j); col = g_ptr_array_index(table->columns,j);
if (mdb_is_fixed_col(col) && if (mdb_is_fixed_col(col) &&
++fixed_cols_found <= fixed_cols) { ++fixed_cols_found <= fixed_cols) {
/*
if (!strcmp(col->name, "Type")) {
printf("column Type, col_start %d row_start %d data %d %d\n",col_start, row_start, mdb->pg_buf[row_start + col_start], mdb->pg_buf[row_start + col_start + 1]);
}
*/
isnull = mdb_is_null(null_mask, j+1); isnull = mdb_is_null(null_mask, j+1);
rc = _mdb_attempt_bind(mdb, col, isnull, rc = _mdb_attempt_bind(mdb, col, isnull,
row_start + col_start, col->col_size); row_start + col_start, col->col_size);
@ -180,9 +208,13 @@ unsigned char isnull;
col_start += 256; col_start += 256;
num_of_jumps++; num_of_jumps++;
} }
if (mdb->jet_version==MDB_VER_JET4) {
eod = mdb_get_int16(mdb, row_end - 2 - var_cols*2 -bitmask_sz - num_of_jumps - 1);
col_start = mdb_get_int16(mdb, row_end - bitmask_sz - 2 - num_of_jumps - 1);
} else {
eod = mdb->pg_buf[row_end-1-var_cols-bitmask_sz-num_of_jumps]; eod = mdb->pg_buf[row_end-1-var_cols-bitmask_sz-num_of_jumps];
col_start = mdb->pg_buf[row_end-bitmask_sz-1-num_of_jumps]; col_start = mdb->pg_buf[row_end-bitmask_sz-1-num_of_jumps];
}
/* variable columns */ /* variable columns */
@ -193,23 +225,30 @@ unsigned char isnull;
/* col_start = mdb->pg_buf[row_end-bitmask_sz-var_cols_found]; */ /* col_start = mdb->pg_buf[row_end-bitmask_sz-var_cols_found]; */
/* more code goes here but the diff is mangled */ /* more code goes here but the diff is mangled */
/*
if (var_cols_found == mdb->pg_buf[row_end-bitmask_sz-jumps_used-1] && if (var_cols_found == mdb->pg_buf[row_end-bitmask_sz-jumps_used-1] &&
jumps_used < num_of_jumps) { jumps_used < num_of_jumps) {
row_start += 256; row_start += 256;
col_start -= 256; col_start -= 256;
jumps_used++; jumps_used++;
} }
*/
if (var_cols_found==var_cols) if (var_cols_found==var_cols) {
len=eod - col_start; len=eod - col_start;
else } else {
len=mdb->pg_buf[row_end if (mdb->jet_version==MDB_VER_JET4) {
- bitmask_sz len=mdb->pg_buf[row_end - bitmask_sz - var_cols_found * 2
- var_cols_found - 2 - 1 - num_of_jumps * 2] - col_start;
} else {
len=mdb->pg_buf[row_end - bitmask_sz - var_cols_found
- 1 - num_of_jumps ] - col_start; - 1 - num_of_jumps ] - col_start;
}
}
isnull = mdb_is_null(null_mask, j+1); isnull = mdb_is_null(null_mask, j+1);
//printf("binding len %d isnull %d col_start %d row_start %d row_end %d bitmask %d var_cols_found %d buf %d\n", len, isnull,col_start,row_start,row_end, bitmask_sz, var_cols_found, mdb->pg_buf[row_end - bitmask_sz - var_cols_found * 2 - 1 - num_of_jumps ]);
rc = _mdb_attempt_bind(mdb, col, isnull, rc = _mdb_attempt_bind(mdb, col, isnull,
row_start + col_start, len); row_start + col_start, len);
if (!rc) return 0; if (!rc) return 0;
@ -246,7 +285,7 @@ MdbHandle *mdb = entry->mdb;
if (!mdb_read_pg(mdb, table->cur_phys_pg++)) if (!mdb_read_pg(mdb, table->cur_phys_pg++))
return 0; return 0;
} while (mdb->pg_buf[0]!=0x01 || mdb_get_int32(mdb, 4)!=entry->table_pg); } while (mdb->pg_buf[0]!=0x01 || mdb_get_int32(mdb, 4)!=entry->table_pg);
/*fprintf(stderr,"returning new page %ld\n", table->cur_phys_pg); */ // fprintf(stderr,"returning new page %ld\n", table->cur_phys_pg);
return table->cur_phys_pg; return table->cur_phys_pg;
} }
int mdb_rewind_table(MdbTableDef *table) int mdb_rewind_table(MdbTableDef *table)
@ -272,7 +311,7 @@ int rc;
} }
do { do {
rows = mdb_get_int16(mdb,8); rows = mdb_get_int16(mdb,mdb->row_count_offset);
/* if at end of page, find a new page */ /* if at end of page, find a new page */
if (table->cur_row >= rows) { if (table->cur_row >= rows) {
@ -280,6 +319,7 @@ int rc;
if (!mdb_read_next_dpg(table)) return 0; if (!mdb_read_next_dpg(table)) return 0;
} }
//printf("page %d row %d\n",table->cur_phys_pg, table->cur_row);
rc = mdb_read_row(table, table->cur_row); rc = mdb_read_row(table, table->cur_row);
table->cur_row++; table->cur_row++;
} while (!rc); } while (!rc);
@ -358,6 +398,7 @@ char *mdb_col_to_string(MdbHandle *mdb, int start, int datatype, int size)
/* FIX ME -- not thread safe */ /* FIX ME -- not thread safe */
static char text[MDB_BIND_SIZE]; static char text[MDB_BIND_SIZE];
time_t t; time_t t;
int i;
switch (datatype) { switch (datatype) {
case MDB_BOOL: case MDB_BOOL:
@ -388,8 +429,14 @@ time_t t;
if (size<0) { if (size<0) {
return ""; return "";
} }
if (mdb->jet_version==MDB_VER_JET4) {
for (i=0;i<size;i+=2)
text[i/2] = mdb->pg_buf[start + i];
text[size/2]='\0';
} else {
strncpy(text, &mdb->pg_buf[start], size); strncpy(text, &mdb->pg_buf[start], size);
text[size]='\0'; text[size]='\0';
}
return text; return text;
break; break;
case MDB_SDATETIME: case MDB_SDATETIME:

View File

@ -44,9 +44,31 @@ int j,pos;
if (mdb->jet_version == MDB_VER_JET4) { if (mdb->jet_version == MDB_VER_JET4) {
mdb->pg_size = 4096; mdb->pg_size = 4096;
mdb->row_count_offset = 0x0c; mdb->row_count_offset = 0x0c;
mdb->tab_num_rows_offset = 12;
mdb->tab_num_cols_offset = 45;
mdb->tab_num_idxs_offset = 47;
mdb->tab_num_ridxs_offset = 51;
mdb->tab_first_dpg_offset = 56;
mdb->tab_cols_start_offset = 63;
mdb->tab_ridx_entry_size = 12;
mdb->col_fixed_offset = 15;
mdb->col_size_offset = 23;
mdb->col_num_offset = 5;
mdb->tab_col_entry_size = 25;
} else { } else {
mdb->pg_size = 2048; mdb->pg_size = 2048;
mdb->row_count_offset = 0x08; mdb->row_count_offset = 0x08;
mdb->tab_num_rows_offset = 12;
mdb->tab_num_cols_offset = 25;
mdb->tab_num_idxs_offset = 27;
mdb->tab_num_ridxs_offset = 31;
mdb->tab_first_dpg_offset = 36;
mdb->tab_cols_start_offset = 43;
mdb->tab_ridx_entry_size = 8;
mdb->col_fixed_offset = 13;
mdb->col_size_offset = 16;
mdb->col_num_offset = 1;
mdb->tab_col_entry_size = 18;
} }
/* get the db encryption key and xor it back to clear text */ /* get the db encryption key and xor it back to clear text */

View File

@ -50,6 +50,10 @@ void mdb_free_handle(MdbHandle *mdb)
if (mdb->backend_name) free(mdb->backend_name); if (mdb->backend_name) free(mdb->backend_name);
free(mdb); free(mdb);
} }
void mdb_alloc_catalog(MdbHandle *mdb)
{
mdb->catalog = g_array_new(FALSE,FALSE,sizeof(MdbCatalogEntry));
}
void mdb_free_catalog(MdbHandle *mdb) void mdb_free_catalog(MdbHandle *mdb)
{ {
GList *l; GList *l;

View File

@ -19,6 +19,15 @@
#include "mdbtools.h" #include "mdbtools.h"
static gint mdb_col_comparer(MdbColumn *a, MdbColumn *b)
{
if (a->col_num > b->col_num)
return 1;
else if (a->col_num < b->col_num)
return -1;
else
return 0;
}
unsigned char mdb_col_needs_size(int col_type) unsigned char mdb_col_needs_size(int col_type)
{ {
@ -40,11 +49,11 @@ int len, i;
mdb_read_pg(mdb, entry->table_pg); mdb_read_pg(mdb, entry->table_pg);
len = mdb_get_int16(mdb,8); len = mdb_get_int16(mdb,8);
table->num_rows = mdb_get_int32(mdb,12); table->num_rows = mdb_get_int32(mdb, mdb->tab_num_rows_offset);
table->num_cols = mdb_get_int16(mdb,25); table->num_cols = mdb_get_int16(mdb, mdb->tab_num_cols_offset);
table->num_idxs = mdb_get_int32(mdb,27); table->num_idxs = mdb_get_int32(mdb, mdb->tab_num_idxs_offset);
table->num_real_idxs = mdb_get_int32(mdb,31); table->num_real_idxs = mdb_get_int32(mdb, mdb->tab_num_ridxs_offset);
table->first_data_pg = mdb_get_int16(mdb,36); table->first_data_pg = mdb_get_int16(mdb, mdb->tab_first_dpg_offset);
return table; return table;
} }
@ -67,16 +76,18 @@ GPtrArray *mdb_read_columns(MdbTableDef *table)
{ {
MdbHandle *mdb = table->entry->mdb; MdbHandle *mdb = table->entry->mdb;
MdbColumn col, *pcol; MdbColumn col, *pcol;
int len, i; int len, i,j;
unsigned char low_byte, high_byte; unsigned char low_byte, high_byte;
int cur_col, cur_name; int cur_col, cur_name;
int col_type, col_size; int col_type, col_size;
char name[MDB_MAX_OBJ_NAME+1]; char name[MDB_MAX_OBJ_NAME+1];
int name_sz; int name_sz, col_num;
GSList *slist = NULL;
table->columns = g_ptr_array_new(); table->columns = g_ptr_array_new();
cur_col = 43 + (table->num_real_idxs * 8); cur_col = mdb->tab_cols_start_offset +
(table->num_real_idxs * mdb->tab_ridx_entry_size);
/* new code based on patch submitted by Tim Nelson 2000.09.27 */ /* new code based on patch submitted by Tim Nelson 2000.09.27 */
@ -84,22 +95,25 @@ int name_sz;
** column attributes ** column attributes
*/ */
for (i=0;i<table->num_cols;i++) { for (i=0;i<table->num_cols;i++) {
memset(&col,'\0', sizeof(MdbColumn)); memset(&col, 0, sizeof(col));
col.col_num = mdb->pg_buf[cur_col + mdb->col_num_offset];
read_pg_if(mdb, &cur_col, 0); read_pg_if(mdb, &cur_col, 0);
col.col_type = mdb->pg_buf[cur_col]; col.col_type = mdb->pg_buf[cur_col];
read_pg_if(mdb, &cur_col, 13);
col.is_fixed = mdb->pg_buf[cur_col+13] & 0x01 ? 1 : 0;
read_pg_if(mdb, &cur_col, 13);
col.is_fixed = mdb->pg_buf[cur_col + mdb->col_fixed_offset] &
0x01 ? 1 : 0;
read_pg_if(mdb, &cur_col, 17); read_pg_if(mdb, &cur_col, 17);
low_byte = mdb->pg_buf[cur_col+16]; low_byte = mdb->pg_buf[cur_col + mdb->col_size_offset];
read_pg_if(mdb, &cur_col, 18); read_pg_if(mdb, &cur_col, 18);
high_byte = mdb->pg_buf[cur_col+17]; high_byte = mdb->pg_buf[cur_col + mdb->col_size_offset + 1];
col.col_size += high_byte * 256 + low_byte; col.col_size += high_byte * 256 + low_byte;
mdb_append_column(table->columns, &col); pcol = g_memdup(&col, sizeof(MdbColumn));
cur_col += 18; slist = g_slist_insert_sorted(slist,pcol,(GCompareFunc)mdb_col_comparer);
cur_col += mdb->tab_col_entry_size;
} }
cur_name = cur_col; cur_name = cur_col;
@ -109,12 +123,39 @@ int name_sz;
*/ */
for (i=0;i<table->num_cols;i++) { for (i=0;i<table->num_cols;i++) {
/* fetch the column */ /* fetch the column */
pcol = g_ptr_array_index (table->columns, i); pcol = g_slist_nth_data (slist, i);
/* we have reached the end of page */ /* we have reached the end of page */
read_pg_if(mdb, &cur_name, 0); read_pg_if(mdb, &cur_name, 0);
name_sz = mdb->pg_buf[cur_name]; name_sz = mdb->pg_buf[cur_name];
if (mdb->jet_version==MDB_VER_JET4) {
/* FIX ME - for now just skip the high order byte */
cur_name += 2;
/* determine amount of name on this page */
len = ((cur_name + name_sz) > mdb->pg_size) ?
mdb->pg_size - cur_name :
name_sz;
/* strip high order (second) byte from unicode string */
for (j=0;j<len;j+=2) {
pcol->name[j/2] = mdb->pg_buf[cur_name + j];
}
/* name wrapped over page */
if (len < name_sz) {
/* read the next pg */
mdb_read_pg(mdb, mdb_get_int32(mdb,4));
cur_name = 8 - (mdb->pg_size - cur_name);
if (len % 2) cur_name++;
/* get the rest of the name */
for (j=0;j<len;j+=2) {
}
memcpy(&pcol->name[len], &mdb->pg_buf[cur_name], name_sz - len);
}
pcol->name[name_sz]='\0';
cur_name += name_sz;
} else if (mdb->jet_version==MDB_VER_JET3) {
/* determine amount of name on this page */ /* determine amount of name on this page */
len = ((cur_name + name_sz) > mdb->pg_size) ? len = ((cur_name + name_sz) > mdb->pg_size) ?
mdb->pg_size - cur_name : mdb->pg_size - cur_name :
@ -134,7 +175,18 @@ int name_sz;
pcol->name[name_sz]='\0'; pcol->name[name_sz]='\0';
cur_name += name_sz + 1; cur_name += name_sz + 1;
} else {
fprintf(stderr,"Unknown MDB version\n");
} }
}
/* turn this list into an array */
for (i=0;i<table->num_cols;i++) {
pcol = g_slist_nth_data (slist, i);
g_ptr_array_add(table->columns, pcol);
}
g_slist_free(slist);
table->index_start = cur_name; table->index_start = cur_name;
return table->columns; return table->columns;
} }

View File

@ -70,7 +70,7 @@ MAKEINFO = makeinfo
NM = /usr/bin/nm -B NM = /usr/bin/nm -B
OBJDUMP = @OBJDUMP@ OBJDUMP = @OBJDUMP@
ODBC = ODBC =
ODBC_INC = /usrl/local/include ODBC_INC = /usr/local/include
PACKAGE = mdbtools PACKAGE = mdbtools
RANLIB = ranlib RANLIB = ranlib
READLINE_LIBS = -lncurses -lreadline READLINE_LIBS = -lncurses -lreadline
@ -116,7 +116,7 @@ unittest_OBJECTS = unittest.o
unittest_DEPENDENCIES = libmdbodbc.la ../libmdb/libmdb.la \ unittest_DEPENDENCIES = libmdbodbc.la ../libmdb/libmdb.la \
../sql/libmdbsql.la ../sql/libmdbsql.la
unittest_LDFLAGS = unittest_LDFLAGS =
CFLAGS = -g -O2 -DUNIXODBC -DSQL CFLAGS = -g -O2 -DIODBC -DSQL
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC) CCLD = $(CC)

View File

@ -70,7 +70,7 @@ MAKEINFO = makeinfo
NM = /usr/bin/nm -B NM = /usr/bin/nm -B
OBJDUMP = @OBJDUMP@ OBJDUMP = @OBJDUMP@
ODBC = ODBC =
ODBC_INC = /usrl/local/include ODBC_INC = /usr/local/include
PACKAGE = mdbtools PACKAGE = mdbtools
RANLIB = ranlib RANLIB = ranlib
READLINE_LIBS = -lncurses -lreadline READLINE_LIBS = -lncurses -lreadline
@ -96,7 +96,7 @@ libmdbsql_la_LIBADD =
libmdbsql_la_OBJECTS = mdbsql.lo parser.lo lexer.lo libmdbsql_la_OBJECTS = mdbsql.lo parser.lo lexer.lo
LEX_OUTPUT_ROOT = lex.yy LEX_OUTPUT_ROOT = lex.yy
LEXLIB = -lfl LEXLIB = -lfl
CFLAGS = -g -O2 -DUNIXODBC -DSQL CFLAGS = -g -O2 -DIODBC -DSQL
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC) CCLD = $(CC)

View File

@ -70,7 +70,7 @@ MAKEINFO = makeinfo
NM = /usr/bin/nm -B NM = /usr/bin/nm -B
OBJDUMP = @OBJDUMP@ OBJDUMP = @OBJDUMP@
ODBC = ODBC =
ODBC_INC = /usrl/local/include ODBC_INC = /usr/local/include
PACKAGE = mdbtools PACKAGE = mdbtools
RANLIB = ranlib RANLIB = ranlib
READLINE_LIBS = -lncurses -lreadline READLINE_LIBS = -lncurses -lreadline
@ -78,7 +78,7 @@ SQL =
VERSION = 0.3 VERSION = 0.3
YACC = bison -y YACC = bison -y
bin_PROGRAMS = mdb-export mdb-array mdb-schema mdb-tables mdb-parsecsv mdb-header mdb-sql prtable prcat prdata prkkd prdump msysobjects bin_PROGRAMS = mdb-export mdb-array mdb-schema mdb-tables mdb-parsecsv mdb-header mdb-sql mdb-ver prtable prcat prdata prkkd prdump msysobjects
LIBS = `glib-config --libs` $(READLINE_LIBS) -lfl LIBS = `glib-config --libs` $(READLINE_LIBS) -lfl
INCLUDES = -I$(top_srcdir)/include `glib-config --cflags` INCLUDES = -I$(top_srcdir)/include `glib-config --cflags`
LDADD = ../libmdb/libmdb.la LDADD = ../libmdb/libmdb.la
@ -125,6 +125,11 @@ mdb_sql_SOURCES = mdb-sql.c
mdb_sql_OBJECTS = mdb-sql.o mdb_sql_OBJECTS = mdb-sql.o
mdb_sql_DEPENDENCIES = ../libmdb/libmdb.la ../sql/libmdbsql.la mdb_sql_DEPENDENCIES = ../libmdb/libmdb.la ../sql/libmdbsql.la
mdb_sql_LDFLAGS = mdb_sql_LDFLAGS =
mdb_ver_SOURCES = mdb-ver.c
mdb_ver_OBJECTS = mdb-ver.o
mdb_ver_LDADD = $(LDADD)
mdb_ver_DEPENDENCIES = ../libmdb/libmdb.la
mdb_ver_LDFLAGS =
prtable_SOURCES = prtable.c prtable_SOURCES = prtable.c
prtable_OBJECTS = prtable.o prtable_OBJECTS = prtable.o
prtable_LDADD = $(LDADD) prtable_LDADD = $(LDADD)
@ -155,7 +160,7 @@ msysobjects_OBJECTS = msysobjects.o
msysobjects_LDADD = $(LDADD) msysobjects_LDADD = $(LDADD)
msysobjects_DEPENDENCIES = ../libmdb/libmdb.la msysobjects_DEPENDENCIES = ../libmdb/libmdb.la
msysobjects_LDFLAGS = msysobjects_LDFLAGS =
CFLAGS = -g -O2 -DUNIXODBC -DSQL CFLAGS = -g -O2 -DIODBC -DSQL
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC) CCLD = $(CC)
@ -169,10 +174,10 @@ TAR = gtar
GZIP_ENV = --best GZIP_ENV = --best
DEP_FILES = .deps/mdb-array.P .deps/mdb-export.P .deps/mdb-header.P \ DEP_FILES = .deps/mdb-array.P .deps/mdb-export.P .deps/mdb-header.P \
.deps/mdb-parsecsv.P .deps/mdb-schema.P .deps/mdb-sql.P \ .deps/mdb-parsecsv.P .deps/mdb-schema.P .deps/mdb-sql.P \
.deps/mdb-tables.P .deps/msysobjects.P .deps/prcat.P .deps/prdata.P \ .deps/mdb-tables.P .deps/mdb-ver.P .deps/msysobjects.P .deps/prcat.P \
.deps/prdump.P .deps/prkkd.P .deps/prtable.P .deps/prdata.P .deps/prdump.P .deps/prkkd.P .deps/prtable.P
SOURCES = mdb-export.c mdb-array.c mdb-schema.c mdb-tables.c mdb-parsecsv.c mdb-header.c mdb-sql.c prtable.c prcat.c prdata.c prkkd.c prdump.c msysobjects.c SOURCES = mdb-export.c mdb-array.c mdb-schema.c mdb-tables.c mdb-parsecsv.c mdb-header.c mdb-sql.c mdb-ver.c prtable.c prcat.c prdata.c prkkd.c prdump.c msysobjects.c
OBJECTS = mdb-export.o mdb-array.o mdb-schema.o mdb-tables.o mdb-parsecsv.o mdb-header.o mdb-sql.o prtable.o prcat.o prdata.o prkkd.o prdump.o msysobjects.o OBJECTS = mdb-export.o mdb-array.o mdb-schema.o mdb-tables.o mdb-parsecsv.o mdb-header.o mdb-sql.o mdb-ver.o prtable.o prcat.o prdata.o prkkd.o prdump.o msysobjects.o
all: all-redirect all: all-redirect
.SUFFIXES: .SUFFIXES:
@ -270,6 +275,10 @@ mdb-sql: $(mdb_sql_OBJECTS) $(mdb_sql_DEPENDENCIES)
@rm -f mdb-sql @rm -f mdb-sql
$(LINK) $(mdb_sql_LDFLAGS) $(mdb_sql_OBJECTS) $(mdb_sql_LDADD) $(LIBS) $(LINK) $(mdb_sql_LDFLAGS) $(mdb_sql_OBJECTS) $(mdb_sql_LDADD) $(LIBS)
mdb-ver: $(mdb_ver_OBJECTS) $(mdb_ver_DEPENDENCIES)
@rm -f mdb-ver
$(LINK) $(mdb_ver_LDFLAGS) $(mdb_ver_OBJECTS) $(mdb_ver_LDADD) $(LIBS)
prtable: $(prtable_OBJECTS) $(prtable_DEPENDENCIES) prtable: $(prtable_OBJECTS) $(prtable_DEPENDENCIES)
@rm -f prtable @rm -f prtable
$(LINK) $(prtable_LDFLAGS) $(prtable_OBJECTS) $(prtable_LDADD) $(LIBS) $(LINK) $(prtable_LDFLAGS) $(prtable_OBJECTS) $(prtable_LDADD) $(LIBS)

View File

@ -1,4 +1,4 @@
bin_PROGRAMS = mdb-export mdb-array mdb-schema mdb-tables mdb-parsecsv mdb-header mdb-sql prtable prcat prdata prkkd prdump msysobjects bin_PROGRAMS = mdb-export mdb-array mdb-schema mdb-tables mdb-parsecsv mdb-header mdb-sql mdb-ver prtable prcat prdata prkkd prdump msysobjects
LIBS = `glib-config --libs` $(READLINE_LIBS) @LEXLIB@ LIBS = `glib-config --libs` $(READLINE_LIBS) @LEXLIB@
INCLUDES = -I$(top_srcdir)/include `glib-config --cflags` INCLUDES = -I$(top_srcdir)/include `glib-config --cflags`
LDADD = ../libmdb/libmdb.la LDADD = ../libmdb/libmdb.la

View File

@ -78,7 +78,7 @@ SQL = @SQL@
VERSION = @VERSION@ VERSION = @VERSION@
YACC = @YACC@ YACC = @YACC@
bin_PROGRAMS = mdb-export mdb-array mdb-schema mdb-tables mdb-parsecsv mdb-header mdb-sql prtable prcat prdata prkkd prdump msysobjects bin_PROGRAMS = mdb-export mdb-array mdb-schema mdb-tables mdb-parsecsv mdb-header mdb-sql mdb-ver prtable prcat prdata prkkd prdump msysobjects
LIBS = `glib-config --libs` $(READLINE_LIBS) @LEXLIB@ LIBS = `glib-config --libs` $(READLINE_LIBS) @LEXLIB@
INCLUDES = -I$(top_srcdir)/include `glib-config --cflags` INCLUDES = -I$(top_srcdir)/include `glib-config --cflags`
LDADD = ../libmdb/libmdb.la LDADD = ../libmdb/libmdb.la
@ -125,6 +125,11 @@ mdb_sql_SOURCES = mdb-sql.c
mdb_sql_OBJECTS = mdb-sql.o mdb_sql_OBJECTS = mdb-sql.o
mdb_sql_DEPENDENCIES = ../libmdb/libmdb.la ../sql/libmdbsql.la mdb_sql_DEPENDENCIES = ../libmdb/libmdb.la ../sql/libmdbsql.la
mdb_sql_LDFLAGS = mdb_sql_LDFLAGS =
mdb_ver_SOURCES = mdb-ver.c
mdb_ver_OBJECTS = mdb-ver.o
mdb_ver_LDADD = $(LDADD)
mdb_ver_DEPENDENCIES = ../libmdb/libmdb.la
mdb_ver_LDFLAGS =
prtable_SOURCES = prtable.c prtable_SOURCES = prtable.c
prtable_OBJECTS = prtable.o prtable_OBJECTS = prtable.o
prtable_LDADD = $(LDADD) prtable_LDADD = $(LDADD)
@ -169,10 +174,10 @@ TAR = gtar
GZIP_ENV = --best GZIP_ENV = --best
DEP_FILES = .deps/mdb-array.P .deps/mdb-export.P .deps/mdb-header.P \ DEP_FILES = .deps/mdb-array.P .deps/mdb-export.P .deps/mdb-header.P \
.deps/mdb-parsecsv.P .deps/mdb-schema.P .deps/mdb-sql.P \ .deps/mdb-parsecsv.P .deps/mdb-schema.P .deps/mdb-sql.P \
.deps/mdb-tables.P .deps/msysobjects.P .deps/prcat.P .deps/prdata.P \ .deps/mdb-tables.P .deps/mdb-ver.P .deps/msysobjects.P .deps/prcat.P \
.deps/prdump.P .deps/prkkd.P .deps/prtable.P .deps/prdata.P .deps/prdump.P .deps/prkkd.P .deps/prtable.P
SOURCES = mdb-export.c mdb-array.c mdb-schema.c mdb-tables.c mdb-parsecsv.c mdb-header.c mdb-sql.c prtable.c prcat.c prdata.c prkkd.c prdump.c msysobjects.c SOURCES = mdb-export.c mdb-array.c mdb-schema.c mdb-tables.c mdb-parsecsv.c mdb-header.c mdb-sql.c mdb-ver.c prtable.c prcat.c prdata.c prkkd.c prdump.c msysobjects.c
OBJECTS = mdb-export.o mdb-array.o mdb-schema.o mdb-tables.o mdb-parsecsv.o mdb-header.o mdb-sql.o prtable.o prcat.o prdata.o prkkd.o prdump.o msysobjects.o OBJECTS = mdb-export.o mdb-array.o mdb-schema.o mdb-tables.o mdb-parsecsv.o mdb-header.o mdb-sql.o mdb-ver.o prtable.o prcat.o prdata.o prkkd.o prdump.o msysobjects.o
all: all-redirect all: all-redirect
.SUFFIXES: .SUFFIXES:
@ -270,6 +275,10 @@ mdb-sql: $(mdb_sql_OBJECTS) $(mdb_sql_DEPENDENCIES)
@rm -f mdb-sql @rm -f mdb-sql
$(LINK) $(mdb_sql_LDFLAGS) $(mdb_sql_OBJECTS) $(mdb_sql_LDADD) $(LIBS) $(LINK) $(mdb_sql_LDFLAGS) $(mdb_sql_OBJECTS) $(mdb_sql_LDADD) $(LIBS)
mdb-ver: $(mdb_ver_OBJECTS) $(mdb_ver_DEPENDENCIES)
@rm -f mdb-ver
$(LINK) $(mdb_ver_LDFLAGS) $(mdb_ver_OBJECTS) $(mdb_ver_LDADD) $(LIBS)
prtable: $(prtable_OBJECTS) $(prtable_DEPENDENCIES) prtable: $(prtable_OBJECTS) $(prtable_DEPENDENCIES)
@rm -f prtable @rm -f prtable
$(LINK) $(prtable_LDFLAGS) $(prtable_OBJECTS) $(prtable_LDADD) $(LIBS) $(LINK) $(prtable_LDFLAGS) $(prtable_OBJECTS) $(prtable_LDADD) $(LIBS)

View File

@ -26,7 +26,7 @@ unsigned char buf[2048];
MdbHandle *mdb; MdbHandle *mdb;
MdbCatalogEntry entry; MdbCatalogEntry entry;
#if 0
if (argc<2) { if (argc<2) {
fprintf(stderr,"Usage: %s <file> <table>\n",argv[0]); fprintf(stderr,"Usage: %s <file> <table>\n",argv[0]);
exit(1); exit(1);
@ -48,5 +48,6 @@ MdbCatalogEntry entry;
mdb_free_handle(mdb); mdb_free_handle(mdb);
mdb_exit(); mdb_exit();
#endif
} }