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
OBJDUMP = @OBJDUMP@
ODBC =
ODBC_INC = /usrl/local/include
ODBC_INC = /usr/local/include
PACKAGE = mdbtools
RANLIB = ranlib
READLINE_LIBS = -lncurses -lreadline

View File

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

View File

@ -112,6 +112,17 @@ typedef struct {
char *backend_name;
/* offset to row count on data pages...version dependant */
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;
typedef struct {
@ -121,9 +132,9 @@ typedef struct {
unsigned long table_pg; /* misnomer since object may not be a table */
unsigned long kkd_pg;
unsigned int kkd_rowid;
int num_props;
int num_props;
GArray *props;
GPtrArray *columns;
GArray *columns;
} MdbCatalogEntry;
typedef struct {
@ -168,6 +179,7 @@ typedef struct {
GPtrArray *sargs;
unsigned char is_fixed;
int query_order;
int col_num;
} MdbColumn;
typedef union {

View File

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

View File

@ -70,7 +70,7 @@ MAKEINFO = makeinfo
NM = /usr/bin/nm -B
OBJDUMP = @OBJDUMP@
ODBC =
ODBC_INC = /usrl/local/include
ODBC_INC = /usr/local/include
PACKAGE = mdbtools
RANLIB = ranlib
READLINE_LIBS = -lncurses -lreadline
@ -95,7 +95,7 @@ mdb_dump_OBJECTS = mdb-dump.o mdbsupport.o
mdb_dump_LDADD = $(LDADD)
mdb_dump_DEPENDENCIES = ../libmdb/libmdb.la
mdb_dump_LDFLAGS =
CFLAGS = -g -O2 -DUNIXODBC -DSQL
CFLAGS = -g -O2 -DIODBC -DSQL
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)

View File

@ -31,7 +31,7 @@ int main(int argc, char **argv)
}
while (length = fread(data,1,16,in)) {
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);
pg++;
}

View File

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

View File

@ -70,7 +70,7 @@ MAKEINFO = makeinfo
NM = /usr/bin/nm -B
OBJDUMP = @OBJDUMP@
ODBC =
ODBC_INC = /usrl/local/include
ODBC_INC = /usr/local/include
PACKAGE = mdbtools
RANLIB = ranlib
READLINE_LIBS = -lncurses -lreadline
@ -94,7 +94,7 @@ libmdb_la_LDFLAGS =
libmdb_la_LIBADD =
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
CFLAGS = -g -O2 -DUNIXODBC -DSQL
CFLAGS = -g -O2 -DIODBC -DSQL
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)

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)
{
int offset;
@ -77,6 +136,7 @@ fprintf(stdout,"\n");
if (mdb->jet_version==MDB_VER_JET4) i++;
}
//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->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];
@ -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
** have a 32bit value of 2 (02 00 00 00) in bytes 4-7.
*/
#if 0
/*
next_pg = MDB_CATALOG_PG;
mdb_free_catalog(mdb);
mdb->num_catalog = 0;
@ -129,7 +189,7 @@ int next_pg, next_pg_off;
}
}
return (mdb->catalog);
#endif
*/
mdb_free_catalog(mdb);
mdb->num_catalog = 0;
@ -144,6 +204,7 @@ int next_pg, next_pg_off;
for (i=0;i<rows;i++) {
if (mdb->pg_buf[11 + 2 * i] & 0x40) continue;
if (mdb_read_catalog_entry(mdb, i, &entry)) {
//printf("page %d\n",next_pg);
mdb->num_catalog++;
mdb->catalog = g_array_append_val(mdb->catalog, entry);
}
@ -152,6 +213,7 @@ int next_pg, next_pg_off;
next_pg++;
}
}
#endif
void mdb_dump_catalog(MdbHandle *mdb, int obj_type)
{
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;
/* Search the previous "row start" values for the first non-deleted
one.
* If we don't find one, then the end of the page is the correct value.
*/
/* Search the previous "row start" values for the first non-deleted one.
* 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--) {
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)) {
break;
}
@ -56,8 +63,8 @@ one.
} else {
row_end = row_start - 1;
}
return row_end;
#endif
}
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)
{
//if (!strcmp("Name",col->name)) {
//printf("start %d %d\n",start, len);
//}
if (col->bind_ptr) {
if (len) {
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 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);
delflag = lookupflag = 0;
if (row_start & 0x8000) delflag++;
if (row_start & 0x4000) lookupflag++;
if (row_start & 0x8000) lookupflag++;
if (row_start & 0x4000) delflag++;
row_start &= 0x0FFF; /* remove flags */
#if DEBUG
fprintf(stdout,"Row %d bytes %d to %d %s %s\n",
@ -120,7 +130,8 @@ unsigned char isnull;
lookupflag ? "[lookup]" : "",
delflag ? "[delflag]" : "");
#endif
if (!table->noskip_del && (delflag || lookupflag)) {
//if (!table->noskip_del && (delflag || lookupflag)) {
if (!table->noskip_del && delflag) {
row_end = row_start-1;
return 0;
}
@ -130,7 +141,11 @@ unsigned char isnull;
#endif
/* find out all the important stuff about the row */
num_cols = mdb->pg_buf[row_start];
if (mdb->jet_version==MDB_VER_JET4) {
num_cols = mdb_get_int16(mdb, row_start);
} else {
num_cols = mdb->pg_buf[row_start];
}
var_cols = 0; /* mdb->pg_buf[row_end-1]; */
fixed_cols = 0; /* num_cols - var_cols; */
for (j = 0; j < table->num_cols; j++) {
@ -141,7 +156,11 @@ unsigned char isnull;
var_cols++;
}
bitmask_sz = (num_cols - 1) / 8 + 1;
eod = mdb->pg_buf[row_end-1-var_cols-bitmask_sz];
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];
}
for (i=0;i<bitmask_sz;i++) {
null_mask[i]=mdb->pg_buf[row_end - bitmask_sz + i + 1];
}
@ -151,8 +170,12 @@ unsigned char isnull;
num_cols, var_cols, eod);
#endif
/* data starts at 1 */
col_start = 1;
if (mdb->jet_version==MDB_VER_JET4) {
col_start = 2;
} else {
/* data starts at 1 */
col_start = 1;
}
fixed_cols_found = 0;
var_cols_found = 0;
@ -161,6 +184,11 @@ unsigned char isnull;
col = g_ptr_array_index(table->columns,j);
if (mdb_is_fixed_col(col) &&
++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);
rc = _mdb_attempt_bind(mdb, col, isnull,
row_start + col_start, col->col_size);
@ -180,9 +208,13 @@ unsigned char isnull;
col_start += 256;
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];
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];
col_start = mdb->pg_buf[row_end-bitmask_sz-1-num_of_jumps];
}
/* variable columns */
@ -193,23 +225,30 @@ unsigned char isnull;
/* col_start = mdb->pg_buf[row_end-bitmask_sz-var_cols_found]; */
/* more code goes here but the diff is mangled */
/*
if (var_cols_found == mdb->pg_buf[row_end-bitmask_sz-jumps_used-1] &&
jumps_used < num_of_jumps) {
row_start += 256;
col_start -= 256;
jumps_used++;
}
*/
if (var_cols_found==var_cols)
if (var_cols_found==var_cols) {
len=eod - col_start;
else
len=mdb->pg_buf[row_end
- bitmask_sz
- var_cols_found
} else {
if (mdb->jet_version==MDB_VER_JET4) {
len=mdb->pg_buf[row_end - bitmask_sz - var_cols_found * 2
- 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;
}
}
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,
row_start + col_start, len);
if (!rc) return 0;
@ -246,7 +285,7 @@ MdbHandle *mdb = entry->mdb;
if (!mdb_read_pg(mdb, table->cur_phys_pg++))
return 0;
} 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;
}
int mdb_rewind_table(MdbTableDef *table)
@ -272,7 +311,7 @@ int rc;
}
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 (table->cur_row >= rows) {
@ -280,6 +319,7 @@ int rc;
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);
table->cur_row++;
} while (!rc);
@ -358,6 +398,7 @@ char *mdb_col_to_string(MdbHandle *mdb, int start, int datatype, int size)
/* FIX ME -- not thread safe */
static char text[MDB_BIND_SIZE];
time_t t;
int i;
switch (datatype) {
case MDB_BOOL:
@ -388,8 +429,14 @@ time_t t;
if (size<0) {
return "";
}
strncpy(text, &mdb->pg_buf[start], size);
text[size]='\0';
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);
text[size]='\0';
}
return text;
break;
case MDB_SDATETIME:

View File

@ -44,9 +44,31 @@ int j,pos;
if (mdb->jet_version == MDB_VER_JET4) {
mdb->pg_size = 4096;
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 {
mdb->pg_size = 2048;
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 */

View File

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

View File

@ -19,6 +19,15 @@
#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)
{
@ -40,11 +49,11 @@ int len, i;
mdb_read_pg(mdb, entry->table_pg);
len = mdb_get_int16(mdb,8);
table->num_rows = mdb_get_int32(mdb,12);
table->num_cols = mdb_get_int16(mdb,25);
table->num_idxs = mdb_get_int32(mdb,27);
table->num_real_idxs = mdb_get_int32(mdb,31);
table->first_data_pg = mdb_get_int16(mdb,36);
table->num_rows = mdb_get_int32(mdb, mdb->tab_num_rows_offset);
table->num_cols = mdb_get_int16(mdb, mdb->tab_num_cols_offset);
table->num_idxs = mdb_get_int32(mdb, mdb->tab_num_idxs_offset);
table->num_real_idxs = mdb_get_int32(mdb, mdb->tab_num_ridxs_offset);
table->first_data_pg = mdb_get_int16(mdb, mdb->tab_first_dpg_offset);
return table;
}
@ -67,39 +76,44 @@ GPtrArray *mdb_read_columns(MdbTableDef *table)
{
MdbHandle *mdb = table->entry->mdb;
MdbColumn col, *pcol;
int len, i;
int len, i,j;
unsigned char low_byte, high_byte;
int cur_col, cur_name;
int col_type, col_size;
char name[MDB_MAX_OBJ_NAME+1];
int name_sz;
int name_sz, col_num;
GSList *slist = NULL;
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 */
/*
** column attributes
*/
for (i=0; i<table->num_cols;i++) {
memset(&col,'\0', sizeof(MdbColumn));
for (i=0;i<table->num_cols;i++) {
memset(&col, 0, sizeof(col));
col.col_num = mdb->pg_buf[cur_col + mdb->col_num_offset];
read_pg_if(mdb, &cur_col, 0);
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;
col.is_fixed = mdb->pg_buf[cur_col + mdb->col_fixed_offset] &
0x01 ? 1 : 0;
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);
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;
mdb_append_column(table->columns, &col);
cur_col += 18;
pcol = g_memdup(&col, sizeof(MdbColumn));
slist = g_slist_insert_sorted(slist,pcol,(GCompareFunc)mdb_col_comparer);
cur_col += mdb->tab_col_entry_size;
}
cur_name = cur_col;
@ -109,32 +123,70 @@ int name_sz;
*/
for (i=0;i<table->num_cols;i++) {
/* 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 */
read_pg_if(mdb, &cur_name, 0);
name_sz = mdb->pg_buf[cur_name];
/* determine amount of name on this page */
len = ((cur_name + name_sz) > mdb->pg_size) ?
mdb->pg_size - cur_name :
name_sz;
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';
if (len) {
memcpy(pcol->name, &mdb->pg_buf[cur_name+1], len);
}
/* 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);
/* get the rest of the name */
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 */
len = ((cur_name + name_sz) > mdb->pg_size) ?
mdb->pg_size - cur_name :
name_sz;
if (len) {
memcpy(pcol->name, &mdb->pg_buf[cur_name+1], len);
}
/* 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);
/* get the rest of the name */
memcpy(&pcol->name[len], &mdb->pg_buf[cur_name], name_sz - len);
}
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;
return table->columns;
}

View File

@ -70,7 +70,7 @@ MAKEINFO = makeinfo
NM = /usr/bin/nm -B
OBJDUMP = @OBJDUMP@
ODBC =
ODBC_INC = /usrl/local/include
ODBC_INC = /usr/local/include
PACKAGE = mdbtools
RANLIB = ranlib
READLINE_LIBS = -lncurses -lreadline
@ -116,7 +116,7 @@ unittest_OBJECTS = unittest.o
unittest_DEPENDENCIES = libmdbodbc.la ../libmdb/libmdb.la \
../sql/libmdbsql.la
unittest_LDFLAGS =
CFLAGS = -g -O2 -DUNIXODBC -DSQL
CFLAGS = -g -O2 -DIODBC -DSQL
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)

View File

@ -70,7 +70,7 @@ MAKEINFO = makeinfo
NM = /usr/bin/nm -B
OBJDUMP = @OBJDUMP@
ODBC =
ODBC_INC = /usrl/local/include
ODBC_INC = /usr/local/include
PACKAGE = mdbtools
RANLIB = ranlib
READLINE_LIBS = -lncurses -lreadline
@ -96,7 +96,7 @@ libmdbsql_la_LIBADD =
libmdbsql_la_OBJECTS = mdbsql.lo parser.lo lexer.lo
LEX_OUTPUT_ROOT = lex.yy
LEXLIB = -lfl
CFLAGS = -g -O2 -DUNIXODBC -DSQL
CFLAGS = -g -O2 -DIODBC -DSQL
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)

View File

@ -70,7 +70,7 @@ MAKEINFO = makeinfo
NM = /usr/bin/nm -B
OBJDUMP = @OBJDUMP@
ODBC =
ODBC_INC = /usrl/local/include
ODBC_INC = /usr/local/include
PACKAGE = mdbtools
RANLIB = ranlib
READLINE_LIBS = -lncurses -lreadline
@ -78,7 +78,7 @@ SQL =
VERSION = 0.3
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
INCLUDES = -I$(top_srcdir)/include `glib-config --cflags`
LDADD = ../libmdb/libmdb.la
@ -125,6 +125,11 @@ mdb_sql_SOURCES = mdb-sql.c
mdb_sql_OBJECTS = mdb-sql.o
mdb_sql_DEPENDENCIES = ../libmdb/libmdb.la ../sql/libmdbsql.la
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_OBJECTS = prtable.o
prtable_LDADD = $(LDADD)
@ -155,7 +160,7 @@ msysobjects_OBJECTS = msysobjects.o
msysobjects_LDADD = $(LDADD)
msysobjects_DEPENDENCIES = ../libmdb/libmdb.la
msysobjects_LDFLAGS =
CFLAGS = -g -O2 -DUNIXODBC -DSQL
CFLAGS = -g -O2 -DIODBC -DSQL
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)
@ -169,10 +174,10 @@ TAR = gtar
GZIP_ENV = --best
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-tables.P .deps/msysobjects.P .deps/prcat.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
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
.deps/mdb-tables.P .deps/mdb-ver.P .deps/msysobjects.P .deps/prcat.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 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 mdb-ver.o prtable.o prcat.o prdata.o prkkd.o prdump.o msysobjects.o
all: all-redirect
.SUFFIXES:
@ -270,6 +275,10 @@ mdb-sql: $(mdb_sql_OBJECTS) $(mdb_sql_DEPENDENCIES)
@rm -f mdb-sql
$(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)
@rm -f prtable
$(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@
INCLUDES = -I$(top_srcdir)/include `glib-config --cflags`
LDADD = ../libmdb/libmdb.la

View File

@ -78,7 +78,7 @@ SQL = @SQL@
VERSION = @VERSION@
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@
INCLUDES = -I$(top_srcdir)/include `glib-config --cflags`
LDADD = ../libmdb/libmdb.la
@ -125,6 +125,11 @@ mdb_sql_SOURCES = mdb-sql.c
mdb_sql_OBJECTS = mdb-sql.o
mdb_sql_DEPENDENCIES = ../libmdb/libmdb.la ../sql/libmdbsql.la
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_OBJECTS = prtable.o
prtable_LDADD = $(LDADD)
@ -169,10 +174,10 @@ TAR = gtar
GZIP_ENV = --best
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-tables.P .deps/msysobjects.P .deps/prcat.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
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
.deps/mdb-tables.P .deps/mdb-ver.P .deps/msysobjects.P .deps/prcat.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 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 mdb-ver.o prtable.o prcat.o prdata.o prkkd.o prdump.o msysobjects.o
all: all-redirect
.SUFFIXES:
@ -270,6 +275,10 @@ mdb-sql: $(mdb_sql_OBJECTS) $(mdb_sql_DEPENDENCIES)
@rm -f mdb-sql
$(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)
@rm -f prtable
$(LINK) $(prtable_LDFLAGS) $(prtable_OBJECTS) $(prtable_LDADD) $(LIBS)

View File

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