odbc fixes, updates for v0.4

This commit is contained in:
brianb 2002-04-03 23:02:53 +00:00
parent 9b8285d937
commit e2c3a9d818
16 changed files with 177 additions and 45 deletions

View File

@ -1,3 +1,7 @@
Tue Apr 2 21:02:13 EST 2002 Brian Bruns <camber@ais.org>
* src/libmdb/data.c: ignore 0xff in row offset table (Don Badrak)
Wed Mar 20 22:49:33 EST 2002 Brian Bruns <camber@ais.org>
* include/mdbtools.h: increased page size for 2048 to 4096

View File

@ -14,7 +14,7 @@ mdb-tables -- a simple dump of table names to be used with shell scripts
mdb-header -- generates a C header to be used in exporting mdb data to a C prog.
mdb-parsecvs -- generates a C program given a CSV file made with mdb-export
mdb-sql -- if --enable-sql is specified, a simple SQL engine (also used by
ODBC).
ODBC and gmdb).
And some utilities useful for debugging:
@ -23,6 +23,6 @@ prkkd -- dump of information about design view data given the offset to it.
prtable -- dump of a table definition.
prdata -- dump of the data given a table name.
Once MDB Tools has been compiled, libmdb.a will be in the src/libmdb directory
and the utility programs will be in the src/util directory.
Once MDB Tools has been compiled, libmdb.[so|a] will be in the src/libmdb
directory and the utility programs will be in the src/util directory.
You can then run 'make install' as root to install (to /usr/local by default).

View File

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

7
README
View File

@ -2,13 +2,12 @@ This is mdbtools version 0.4
This software is still beta so don't expect too much.
For the rest of you, read the HACKING file for a description of where the code
stands and what has been gleened of the file format.
If you are interested in helping, read the HACKING file for a description of
where the code stands and what has been gleened of the file format.
The initial goal of these tools is to be able to extract data structures and
data from mdb files. This goal will of course expand over time as the file
format becomes more well understood. Also in the plans is a Gtk+ browser for
MDB files and a ODBC/SQL frontend.
format becomes more well understood.
Files in libmdb are licensed under LGPL and the utilities under the GPL, see
COPYING.LIB and COPYING files respectively.

39
TODO
View File

@ -1,6 +1,15 @@
Things to Do
------------
file format:
. how does global allocation map work?
. export VB script
. re-examine KKD records for form design (OLE streams?)
. write support
libmdb:
. Complete the list of datatypes
. Straighten out which functions in libmdb are meant to be used and which
ones should be static.
@ -9,4 +18,32 @@ Things to Do
. Need a way to express logical relationships between sargs (tree)
. Add support for index scanning when using sargs
. Use allocation maps to read tables, should be more efficient
. Figure out why we get unresolved symbols when ODBC driver load by DM
. write support
utils:
. need program to unpack VBA script to file
. Access forms to glade converter ?
SQL Engine:
. SQL Engine does not handle uppercase keywords
. Joins
. OR clauses using sarg trees from above
. insert/updates
. bogus column name in where clause not caught
ODBC:
. Figure out why we get unresolved symbols when ODBC driver load by DM (iODBC
only?)
. Boolean not working
. many unimplemented funtions
GMDB:
. Finish debug dissectors
. Export schema not implemented
. Printing not implemented
. Test for SQL engine and pop up message when not present.
. Export needs finishing

View File

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

View File

@ -185,6 +185,8 @@ typedef struct {
unsigned char is_fixed;
int query_order;
int col_num;
int cur_value_start;
int cur_value_len;
} MdbColumn;
typedef union {

View File

@ -70,7 +70,7 @@ MAKEINFO = makeinfo
NM = /usr/bin/nm -B
OBJDUMP = @OBJDUMP@
ODBC =
ODBC_INC =
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 =
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 -DSQL
CFLAGS = -g -O2 -DUNIXODBC -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 =
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 -DSQL
CFLAGS = -g -O2 -DUNIXODBC -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

@ -81,6 +81,7 @@ int bit_num = (col_num - 1) % 8;
** value*/
static int mdb_xfer_bound_bool(MdbHandle *mdb, MdbColumn *col, int value)
{
col->cur_value_len = value;
if (col->bind_ptr) {
strcpy(col->bind_ptr, value ? "0" : "1");
}
@ -90,6 +91,13 @@ static int mdb_xfer_bound_data(MdbHandle *mdb, int start, MdbColumn *col, int le
//if (!strcmp("Name",col->name)) {
//printf("start %d %d\n",start, len);
//}
if (len) {
col->cur_value_start = start;
col->cur_value_len = len;
} else {
col->cur_value_start = 0;
col->cur_value_len = 0;
}
if (col->bind_ptr) {
if (len) {
strcpy(col->bind_ptr,
@ -114,6 +122,7 @@ int num_of_jumps=0, jumps_used=0;
int eod; /* end of data */
int delflag, lookupflag;
int bitmask_sz;
int col_ptr, deleted_columns=0;
unsigned char null_mask[33]; /* 256 columns max / 8 bits per byte */
unsigned char isnull;
@ -210,11 +219,17 @@ unsigned char isnull;
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);
col_ptr = row_end - 2 - bitmask_sz - num_of_jumps - 1;
eod = mdb_get_int16(mdb, col_ptr - var_cols*2);
col_start = mdb_get_int16(mdb, col_ptr);
} 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];
col_ptr = row_end - bitmask_sz - num_of_jumps - 1;
if (mdb->pg_buf[col_ptr]==0xFF) {
col_ptr--;
deleted_columns++;
}
eod = mdb->pg_buf[col_ptr - var_cols];
col_start = mdb->pg_buf[col_ptr];
}
@ -243,8 +258,7 @@ unsigned char isnull;
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;
len=mdb->pg_buf[col_ptr - var_cols_found ] - col_start;
}
if (len<0)
len+=256;

View File

@ -70,7 +70,7 @@ MAKEINFO = makeinfo
NM = /usr/bin/nm -B
OBJDUMP = @OBJDUMP@
ODBC =
ODBC_INC =
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 -DSQL
CFLAGS = -g -O2 -DUNIXODBC -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

@ -160,12 +160,12 @@ void SetConnectString (ConnectParams* params, const gchar* connectString)
* remove trailing spaces from name
*/
end = strlen (name) - 1;
while (end > 0 && name[end] == ' ')
while (end > 0 && isspace(name[end]))
name[end--] = '\0';
/*
* remove leading spaces from value
*/
while (*value == ' ')
while (isspace(*value))
value++;
if (g_hash_table_lookup_extended (params->table, name, &key, &oldvalue))
@ -239,7 +239,7 @@ gchar* ExtractDSN (ConnectParams* params, const gchar* connectString)
* Skip over any leading spaces
*/
q++;
while (*q == ' ')
while (isspace(*q))
q++;
/*
* Copy the DSN value to a buffer
@ -410,7 +410,7 @@ static int GetNextItem (FILE* stream, char** name, char** value)
if ((token = strtok (line, equals)) == NULL) return 0;
len = strlen (token);
while (len > 0 && token[len-1] == ' ')
while (len > 0 && isspace(token[len-1]))
{
len--;
token[len] = '\0';
@ -421,7 +421,7 @@ static int GetNextItem (FILE* stream, char** name, char** value)
*/
token = strtok (NULL, equals);
if (token == NULL) return 0;
while (*token && token[0] == ' ')
while (*token && isspace(token[0]))
token++;
*value = token;

View File

@ -32,7 +32,7 @@
#include "connectparams.h"
static char software_version[] = "$Id: odbc.c,v 1.4 2002/01/24 12:34:13 brianb Exp $";
static char software_version[] = "$Id: odbc.c,v 1.5 2002/04/03 23:02:54 brianb Exp $";
static void *no_unused_var_warn[] = {software_version,
no_unused_var_warn};
@ -527,12 +527,19 @@ SQLRETURN SQL_API SQLColAttributes(
SQLINTEGER FAR *pfDesc)
{
int cplen, len = 0;
int namelen, i;
struct _hstmt *stmt;
struct _hdbc *dbc;
struct _henv *env;
MdbSQL *sql;
MdbSQLColumn *sqlcol;
MdbColumn *col;
MdbTableDef *table;
stmt = (struct _hstmt *) hstmt;
dbc = (struct _hdbc *) stmt->hdbc;
env = (struct _henv *) dbc->henv;
sql = env->sql;
/* dont check column index for these */
switch(fDescType) {
@ -541,17 +548,38 @@ struct _hdbc *dbc;
break;
}
if (icol<1 || icol>sql->num_columns) {
return SQL_ERROR;
}
/* find the column */
sqlcol = g_ptr_array_index(sql->columns,icol - 1);
table = sql->cur_table;
for (i=0;i<table->num_cols;i++) {
col=g_ptr_array_index(table->columns,i);
if (!strcasecmp(sqlcol->name, col->name)) {
break;
}
}
switch(fDescType) {
case SQL_COLUMN_NAME:
case SQL_COLUMN_LABEL:
namelen = MIN(cbDescMax,strlen(sqlcol->name));
strncpy(rgbDesc, sqlcol->name, namelen);
*((char *)&rgbDesc[namelen])='\0';
break;
case SQL_COLUMN_TYPE:
*pcbDesc = SQL_CHAR;
break;
case SQL_COLUMN_LENGTH:
break;
case SQL_COLUMN_DISPLAY_SIZE:
switch(_odbc_get_client_type(1)) {
//case SQL_COLUMN_DISPLAY_SIZE:
case SQL_DESC_DISPLAY_SIZE:
switch(_odbc_get_client_type(col->col_type)) {
case SQL_CHAR:
case SQL_VARCHAR:
*pfDesc = col->col_size;
break;
case SQL_INTEGER:
*pfDesc = 8;
@ -562,6 +590,9 @@ struct _hdbc *dbc;
case SQL_TINYINT:
*pfDesc = 4;
break;
default:
//fprintf(stderr,"\nUnknown type %d\n", _odbc_get_client_type(col->col_type));
break;
}
break;
}
@ -657,6 +688,7 @@ struct _hdbc *dbc = (struct _hdbc *) stmt->hdbc;
struct _henv *env = (struct _henv *) dbc->henv;
if (mdb_fetch_row(env->sql->cur_table)) {
stmt->row_affected++;
return SQL_SUCCESS;
} else {
return SQL_NO_DATA_FOUND;
@ -765,7 +797,7 @@ SQLRETURN SQL_API SQLPrepare(
SQLCHAR FAR *szSqlStr,
SQLINTEGER cbSqlStr)
{
struct _hstmt *stmt=(struct _hstmt *)hstmt;
struct _hstmt *stmt=(struct _hstmt *)hstmt;
if (cbSqlStr!=SQL_NTS) {
strncpy(stmt->query, szSqlStr, cbSqlStr);
@ -781,6 +813,9 @@ SQLRETURN SQL_API SQLRowCount(
SQLHSTMT hstmt,
SQLINTEGER FAR *pcrow)
{
struct _hstmt *stmt=(struct _hstmt *)hstmt;
*pcrow = stmt->row_affected;
return SQL_SUCCESS;
}
@ -845,10 +880,41 @@ SQLRETURN SQL_API SQLGetData(
SQLINTEGER FAR *pcbValue)
{
struct _hstmt *stmt;
struct _hdbc *dbc;
struct _henv *env;
unsigned char *src;
int srclen;
MdbSQL *sql;
MdbHandle *mdb;
MdbSQLColumn *sqlcol;
MdbColumn *col;
MdbTableDef *table;
int i;
stmt = (struct _hstmt *) hstmt;
dbc = (struct _hdbc *) stmt->hdbc;
env = (struct _henv *) dbc->henv;
sql = env->sql;
mdb = sql->mdb;
if (icol<1 || icol>sql->num_columns) {
return SQL_ERROR;
}
sqlcol = g_ptr_array_index(sql->columns,icol - 1);
table = sql->cur_table;
for (i=0;i<table->num_cols;i++) {
col=g_ptr_array_index(table->columns,i);
if (!strcasecmp(sqlcol->name, col->name)) {
break;
}
}
strcpy(rgbValue,
mdb_col_to_string(mdb, col->cur_value_start, col->col_type,
col->cur_value_len));
//*((char *)&rgbValue[col->cur_value_len])='\0';
*pcbValue = col->cur_value_len;
return 0;
}
@ -1100,20 +1166,30 @@ static int _odbc_get_server_type(int clt_type)
static SQLSMALLINT _odbc_get_client_type(int srv_type)
{
switch (srv_type) {
MDB_BOOL:
case MDB_BOOL:
return SQL_BIT;
MDB_BYTE:
break;
case MDB_BYTE:
return SQL_TINYINT;
MDB_INT:
break;
case MDB_INT:
return SQL_SMALLINT;
MDB_LONGINT:
break;
case MDB_LONGINT:
return SQL_INTEGER;
MDB_FLOAT:
break;
case MDB_FLOAT:
return SQL_FLOAT;
MDB_DOUBLE:
break;
case MDB_DOUBLE:
return SQL_DOUBLE;
MDB_TEXT:
break;
case MDB_TEXT:
return SQL_VARCHAR;
break;
default:
// fprintf(stderr,"Unknown type %d\n",srv_type);
break;
}
}

View File

@ -70,7 +70,7 @@ MAKEINFO = makeinfo
NM = /usr/bin/nm -B
OBJDUMP = @OBJDUMP@
ODBC =
ODBC_INC =
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 -DSQL
CFLAGS = -g -O2 -DUNIXODBC -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 =
ODBC_INC = /usr/local/include
PACKAGE = mdbtools
RANLIB = ranlib
READLINE_LIBS = -lncurses -lreadline
@ -156,7 +156,7 @@ prdump_OBJECTS = prdump.o
prdump_LDADD = $(LDADD)
prdump_DEPENDENCIES = ../libmdb/libmdb.la
prdump_LDFLAGS =
CFLAGS = -g -O2 -DSQL
CFLAGS = -g -O2 -DUNIXODBC -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)