mirror of
https://github.com/mdbtools/mdbtools.git
synced 2025-04-05 20:31:00 +08:00
Initial changes for Access 2000 files
This commit is contained in:
parent
ea8fd2a6ba
commit
1a96e241d0
2
Makefile
2
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
|
||||
|
@ -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
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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++;
|
||||
}
|
||||
|
@ -160,6 +160,7 @@ typedef struct {
|
||||
GPtrArray *sargs;
|
||||
unsigned char is_fixed;
|
||||
int query_order;
|
||||
int col_num;
|
||||
} MdbColumn;
|
||||
|
||||
typedef union {
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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:
|
||||
|
@ -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 */
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user