diff --git a/Makefile b/Makefile index 8067e39..a60989e 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/include/Makefile b/include/Makefile index 9d6b009..d606fe7 100644 --- a/include/Makefile +++ b/include/Makefile @@ -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 diff --git a/include/mdbtools.h b/include/mdbtools.h index 0631f75..fb328e0 100644 --- a/include/mdbtools.h +++ b/include/mdbtools.h @@ -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 { diff --git a/src/Makefile b/src/Makefile index a01bd96..3c0e354 100644 --- a/src/Makefile +++ b/src/Makefile @@ -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 diff --git a/src/extras/Makefile b/src/extras/Makefile index 143b9e5..9b6f8a1 100644 --- a/src/extras/Makefile +++ b/src/extras/Makefile @@ -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) diff --git a/src/extras/mdb-dump.c b/src/extras/mdb-dump.c index 158b23e..13aef2c 100644 --- a/src/extras/mdb-dump.c +++ b/src/extras/mdb-dump.c @@ -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++; } diff --git a/src/include/mdbtools.h b/src/include/mdbtools.h index 913ee3b..6c0833e 100644 --- a/src/include/mdbtools.h +++ b/src/include/mdbtools.h @@ -160,6 +160,7 @@ typedef struct { GPtrArray *sargs; unsigned char is_fixed; int query_order; + int col_num; } MdbColumn; typedef union { diff --git a/src/libmdb/Makefile b/src/libmdb/Makefile index 48f9713..1758dbf 100644 --- a/src/libmdb/Makefile +++ b/src/libmdb/Makefile @@ -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) diff --git a/src/libmdb/catalog.c b/src/libmdb/catalog.c index 31c8ae8..7dff875 100644 --- a/src/libmdb/catalog.c +++ b/src/libmdb/catalog.c @@ -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;ipg_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; diff --git a/src/libmdb/data.c b/src/libmdb/data.c index f8cafd0..b6b1367 100644 --- a/src/libmdb/data.c +++ b/src/libmdb/data.c @@ -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;ipg_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;ipg_buf[start + i]; + text[size/2]='\0'; + } else { + strncpy(text, &mdb->pg_buf[start], size); + text[size]='\0'; + } return text; break; case MDB_SDATETIME: diff --git a/src/libmdb/file.c b/src/libmdb/file.c index c322d7f..aedb365 100644 --- a/src/libmdb/file.c +++ b/src/libmdb/file.c @@ -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 */ diff --git a/src/libmdb/mem.c b/src/libmdb/mem.c index f97a4f9..7648bc5 100644 --- a/src/libmdb/mem.c +++ b/src/libmdb/mem.c @@ -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; diff --git a/src/libmdb/table.c b/src/libmdb/table.c index 4a5ddf8..886080e 100644 --- a/src/libmdb/table.c +++ b/src/libmdb/table.c @@ -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; inum_cols;i++) { - memset(&col,'\0', sizeof(MdbColumn)); + for (i=0;inum_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;inum_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;jname[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;jname[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;inum_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; } diff --git a/src/odbc/Makefile b/src/odbc/Makefile index 411d867..a23bae8 100644 --- a/src/odbc/Makefile +++ b/src/odbc/Makefile @@ -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) diff --git a/src/sql/Makefile b/src/sql/Makefile index 6a96d6e..53679da 100644 --- a/src/sql/Makefile +++ b/src/sql/Makefile @@ -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) diff --git a/src/util/Makefile b/src/util/Makefile index bfc05eb..b11f60b 100644 --- a/src/util/Makefile +++ b/src/util/Makefile @@ -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) diff --git a/src/util/Makefile.am b/src/util/Makefile.am index 5cb5e84..2d3c334 100644 --- a/src/util/Makefile.am +++ b/src/util/Makefile.am @@ -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 diff --git a/src/util/Makefile.in b/src/util/Makefile.in index f00082c..43e60bc 100644 --- a/src/util/Makefile.in +++ b/src/util/Makefile.in @@ -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) diff --git a/src/util/prkkd.c b/src/util/prkkd.c index 6c17695..657c892 100644 --- a/src/util/prkkd.c +++ b/src/util/prkkd.c @@ -26,7 +26,7 @@ unsigned char buf[2048]; MdbHandle *mdb; MdbCatalogEntry entry; - +#if 0 if (argc<2) { fprintf(stderr,"Usage: %s \n",argv[0]); exit(1); @@ -48,5 +48,6 @@ MdbCatalogEntry entry; mdb_free_handle(mdb); mdb_exit(); +#endif }