mirror of
https://github.com/mdbtools/mdbtools.git
synced 2025-11-26 02:09:49 +08:00
odbc fixes, updates for v0.4
This commit is contained in:
@@ -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>
|
Wed Mar 20 22:49:33 EST 2002 Brian Bruns <camber@ais.org>
|
||||||
|
|
||||||
* include/mdbtools.h: increased page size for 2048 to 4096
|
* include/mdbtools.h: increased page size for 2048 to 4096
|
||||||
|
|||||||
8
INSTALL
8
INSTALL
@@ -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-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-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
|
mdb-sql -- if --enable-sql is specified, a simple SQL engine (also used by
|
||||||
ODBC).
|
ODBC and gmdb).
|
||||||
|
|
||||||
And some utilities useful for debugging:
|
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.
|
prtable -- dump of a table definition.
|
||||||
prdata -- dump of the data given a table name.
|
prdata -- dump of the data given a table name.
|
||||||
|
|
||||||
Once MDB Tools has been compiled, libmdb.a will be in the src/libmdb directory
|
Once MDB Tools has been compiled, libmdb.[so|a] will be in the src/libmdb
|
||||||
and the utility programs will be in the src/util directory.
|
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).
|
||||||
|
|||||||
2
Makefile
2
Makefile
@@ -70,7 +70,7 @@ MAKEINFO = makeinfo
|
|||||||
NM = /usr/bin/nm -B
|
NM = /usr/bin/nm -B
|
||||||
OBJDUMP = @OBJDUMP@
|
OBJDUMP = @OBJDUMP@
|
||||||
ODBC =
|
ODBC =
|
||||||
ODBC_INC =
|
ODBC_INC = /usr/local/include
|
||||||
PACKAGE = mdbtools
|
PACKAGE = mdbtools
|
||||||
RANLIB = ranlib
|
RANLIB = ranlib
|
||||||
READLINE_LIBS = -lncurses -lreadline
|
READLINE_LIBS = -lncurses -lreadline
|
||||||
|
|||||||
7
README
7
README
@@ -2,13 +2,12 @@ This is mdbtools version 0.4
|
|||||||
|
|
||||||
This software is still beta so don't expect too much.
|
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
|
If you are interested in helping, read the HACKING file for a description of
|
||||||
stands and what has been gleened of the file format.
|
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
|
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
|
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
|
format becomes more well understood.
|
||||||
MDB files and a ODBC/SQL frontend.
|
|
||||||
|
|
||||||
Files in libmdb are licensed under LGPL and the utilities under the GPL, see
|
Files in libmdb are licensed under LGPL and the utilities under the GPL, see
|
||||||
COPYING.LIB and COPYING files respectively.
|
COPYING.LIB and COPYING files respectively.
|
||||||
|
|||||||
39
TODO
39
TODO
@@ -1,6 +1,15 @@
|
|||||||
Things to Do
|
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
|
. Complete the list of datatypes
|
||||||
. Straighten out which functions in libmdb are meant to be used and which
|
. Straighten out which functions in libmdb are meant to be used and which
|
||||||
ones should be static.
|
ones should be static.
|
||||||
@@ -9,4 +18,32 @@ Things to Do
|
|||||||
. Need a way to express logical relationships between sargs (tree)
|
. Need a way to express logical relationships between sargs (tree)
|
||||||
. Add support for index scanning when using sargs
|
. Add support for index scanning when using sargs
|
||||||
. Use allocation maps to read tables, should be more efficient
|
. 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
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ MAKEINFO = makeinfo
|
|||||||
NM = /usr/bin/nm -B
|
NM = /usr/bin/nm -B
|
||||||
OBJDUMP = @OBJDUMP@
|
OBJDUMP = @OBJDUMP@
|
||||||
ODBC =
|
ODBC =
|
||||||
ODBC_INC =
|
ODBC_INC = /usr/local/include
|
||||||
PACKAGE = mdbtools
|
PACKAGE = mdbtools
|
||||||
RANLIB = ranlib
|
RANLIB = ranlib
|
||||||
READLINE_LIBS = -lncurses -lreadline
|
READLINE_LIBS = -lncurses -lreadline
|
||||||
|
|||||||
@@ -185,6 +185,8 @@ typedef struct {
|
|||||||
unsigned char is_fixed;
|
unsigned char is_fixed;
|
||||||
int query_order;
|
int query_order;
|
||||||
int col_num;
|
int col_num;
|
||||||
|
int cur_value_start;
|
||||||
|
int cur_value_len;
|
||||||
} MdbColumn;
|
} MdbColumn;
|
||||||
|
|
||||||
typedef union {
|
typedef union {
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ MAKEINFO = makeinfo
|
|||||||
NM = /usr/bin/nm -B
|
NM = /usr/bin/nm -B
|
||||||
OBJDUMP = @OBJDUMP@
|
OBJDUMP = @OBJDUMP@
|
||||||
ODBC =
|
ODBC =
|
||||||
ODBC_INC =
|
ODBC_INC = /usr/local/include
|
||||||
PACKAGE = mdbtools
|
PACKAGE = mdbtools
|
||||||
RANLIB = ranlib
|
RANLIB = ranlib
|
||||||
READLINE_LIBS = -lncurses -lreadline
|
READLINE_LIBS = -lncurses -lreadline
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ MAKEINFO = makeinfo
|
|||||||
NM = /usr/bin/nm -B
|
NM = /usr/bin/nm -B
|
||||||
OBJDUMP = @OBJDUMP@
|
OBJDUMP = @OBJDUMP@
|
||||||
ODBC =
|
ODBC =
|
||||||
ODBC_INC =
|
ODBC_INC = /usr/local/include
|
||||||
PACKAGE = mdbtools
|
PACKAGE = mdbtools
|
||||||
RANLIB = ranlib
|
RANLIB = ranlib
|
||||||
READLINE_LIBS = -lncurses -lreadline
|
READLINE_LIBS = -lncurses -lreadline
|
||||||
@@ -95,7 +95,7 @@ mdb_dump_OBJECTS = mdb-dump.o mdbsupport.o
|
|||||||
mdb_dump_LDADD = $(LDADD)
|
mdb_dump_LDADD = $(LDADD)
|
||||||
mdb_dump_DEPENDENCIES = ../libmdb/libmdb.la
|
mdb_dump_DEPENDENCIES = ../libmdb/libmdb.la
|
||||||
mdb_dump_LDFLAGS =
|
mdb_dump_LDFLAGS =
|
||||||
CFLAGS = -g -O2 -DSQL
|
CFLAGS = -g -O2 -DUNIXODBC -DSQL
|
||||||
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||||
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||||
CCLD = $(CC)
|
CCLD = $(CC)
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ MAKEINFO = makeinfo
|
|||||||
NM = /usr/bin/nm -B
|
NM = /usr/bin/nm -B
|
||||||
OBJDUMP = @OBJDUMP@
|
OBJDUMP = @OBJDUMP@
|
||||||
ODBC =
|
ODBC =
|
||||||
ODBC_INC =
|
ODBC_INC = /usr/local/include
|
||||||
PACKAGE = mdbtools
|
PACKAGE = mdbtools
|
||||||
RANLIB = ranlib
|
RANLIB = ranlib
|
||||||
READLINE_LIBS = -lncurses -lreadline
|
READLINE_LIBS = -lncurses -lreadline
|
||||||
@@ -94,7 +94,7 @@ libmdb_la_LDFLAGS =
|
|||||||
libmdb_la_LIBADD =
|
libmdb_la_LIBADD =
|
||||||
libmdb_la_OBJECTS = catalog.lo mem.lo file.lo kkd.lo table.lo data.lo \
|
libmdb_la_OBJECTS = catalog.lo mem.lo file.lo kkd.lo table.lo data.lo \
|
||||||
dump.lo backend.lo money.lo sargs.lo index.lo like.lo
|
dump.lo backend.lo money.lo sargs.lo index.lo like.lo
|
||||||
CFLAGS = -g -O2 -DSQL
|
CFLAGS = -g -O2 -DUNIXODBC -DSQL
|
||||||
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||||
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||||
CCLD = $(CC)
|
CCLD = $(CC)
|
||||||
|
|||||||
@@ -81,6 +81,7 @@ int bit_num = (col_num - 1) % 8;
|
|||||||
** value*/
|
** value*/
|
||||||
static int mdb_xfer_bound_bool(MdbHandle *mdb, MdbColumn *col, int value)
|
static int mdb_xfer_bound_bool(MdbHandle *mdb, MdbColumn *col, int value)
|
||||||
{
|
{
|
||||||
|
col->cur_value_len = value;
|
||||||
if (col->bind_ptr) {
|
if (col->bind_ptr) {
|
||||||
strcpy(col->bind_ptr, value ? "0" : "1");
|
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)) {
|
//if (!strcmp("Name",col->name)) {
|
||||||
//printf("start %d %d\n",start, len);
|
//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 (col->bind_ptr) {
|
||||||
if (len) {
|
if (len) {
|
||||||
strcpy(col->bind_ptr,
|
strcpy(col->bind_ptr,
|
||||||
@@ -114,6 +122,7 @@ int num_of_jumps=0, jumps_used=0;
|
|||||||
int eod; /* end of data */
|
int eod; /* end of data */
|
||||||
int delflag, lookupflag;
|
int delflag, lookupflag;
|
||||||
int bitmask_sz;
|
int bitmask_sz;
|
||||||
|
int col_ptr, deleted_columns=0;
|
||||||
unsigned char null_mask[33]; /* 256 columns max / 8 bits per byte */
|
unsigned char null_mask[33]; /* 256 columns max / 8 bits per byte */
|
||||||
unsigned char isnull;
|
unsigned char isnull;
|
||||||
|
|
||||||
@@ -210,11 +219,17 @@ unsigned char isnull;
|
|||||||
num_of_jumps++;
|
num_of_jumps++;
|
||||||
}
|
}
|
||||||
if (mdb->jet_version==MDB_VER_JET4) {
|
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_ptr = row_end - 2 - bitmask_sz - num_of_jumps - 1;
|
||||||
col_start = mdb_get_int16(mdb, row_end - bitmask_sz - 2 - num_of_jumps - 1);
|
eod = mdb_get_int16(mdb, col_ptr - var_cols*2);
|
||||||
|
col_start = mdb_get_int16(mdb, col_ptr);
|
||||||
} else {
|
} else {
|
||||||
eod = mdb->pg_buf[row_end-1-var_cols-bitmask_sz-num_of_jumps];
|
col_ptr = row_end - bitmask_sz - num_of_jumps - 1;
|
||||||
col_start = mdb->pg_buf[row_end-bitmask_sz-1-num_of_jumps];
|
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
|
len=mdb->pg_buf[row_end - bitmask_sz - var_cols_found * 2
|
||||||
- 2 - 1 - num_of_jumps * 2] - col_start;
|
- 2 - 1 - num_of_jumps * 2] - col_start;
|
||||||
} else {
|
} else {
|
||||||
len=mdb->pg_buf[row_end - bitmask_sz - var_cols_found
|
len=mdb->pg_buf[col_ptr - var_cols_found ] - col_start;
|
||||||
- 1 - num_of_jumps ] - col_start;
|
|
||||||
}
|
}
|
||||||
if (len<0)
|
if (len<0)
|
||||||
len+=256;
|
len+=256;
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ MAKEINFO = makeinfo
|
|||||||
NM = /usr/bin/nm -B
|
NM = /usr/bin/nm -B
|
||||||
OBJDUMP = @OBJDUMP@
|
OBJDUMP = @OBJDUMP@
|
||||||
ODBC =
|
ODBC =
|
||||||
ODBC_INC =
|
ODBC_INC = /usr/local/include
|
||||||
PACKAGE = mdbtools
|
PACKAGE = mdbtools
|
||||||
RANLIB = ranlib
|
RANLIB = ranlib
|
||||||
READLINE_LIBS = -lncurses -lreadline
|
READLINE_LIBS = -lncurses -lreadline
|
||||||
@@ -116,7 +116,7 @@ unittest_OBJECTS = unittest.o
|
|||||||
unittest_DEPENDENCIES = libmdbodbc.la ../libmdb/libmdb.la \
|
unittest_DEPENDENCIES = libmdbodbc.la ../libmdb/libmdb.la \
|
||||||
../sql/libmdbsql.la
|
../sql/libmdbsql.la
|
||||||
unittest_LDFLAGS =
|
unittest_LDFLAGS =
|
||||||
CFLAGS = -g -O2 -DSQL
|
CFLAGS = -g -O2 -DUNIXODBC -DSQL
|
||||||
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||||
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||||
CCLD = $(CC)
|
CCLD = $(CC)
|
||||||
|
|||||||
@@ -160,12 +160,12 @@ void SetConnectString (ConnectParams* params, const gchar* connectString)
|
|||||||
* remove trailing spaces from name
|
* remove trailing spaces from name
|
||||||
*/
|
*/
|
||||||
end = strlen (name) - 1;
|
end = strlen (name) - 1;
|
||||||
while (end > 0 && name[end] == ' ')
|
while (end > 0 && isspace(name[end]))
|
||||||
name[end--] = '\0';
|
name[end--] = '\0';
|
||||||
/*
|
/*
|
||||||
* remove leading spaces from value
|
* remove leading spaces from value
|
||||||
*/
|
*/
|
||||||
while (*value == ' ')
|
while (isspace(*value))
|
||||||
value++;
|
value++;
|
||||||
|
|
||||||
if (g_hash_table_lookup_extended (params->table, name, &key, &oldvalue))
|
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
|
* Skip over any leading spaces
|
||||||
*/
|
*/
|
||||||
q++;
|
q++;
|
||||||
while (*q == ' ')
|
while (isspace(*q))
|
||||||
q++;
|
q++;
|
||||||
/*
|
/*
|
||||||
* Copy the DSN value to a buffer
|
* 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;
|
if ((token = strtok (line, equals)) == NULL) return 0;
|
||||||
|
|
||||||
len = strlen (token);
|
len = strlen (token);
|
||||||
while (len > 0 && token[len-1] == ' ')
|
while (len > 0 && isspace(token[len-1]))
|
||||||
{
|
{
|
||||||
len--;
|
len--;
|
||||||
token[len] = '\0';
|
token[len] = '\0';
|
||||||
@@ -421,7 +421,7 @@ static int GetNextItem (FILE* stream, char** name, char** value)
|
|||||||
*/
|
*/
|
||||||
token = strtok (NULL, equals);
|
token = strtok (NULL, equals);
|
||||||
if (token == NULL) return 0;
|
if (token == NULL) return 0;
|
||||||
while (*token && token[0] == ' ')
|
while (*token && isspace(token[0]))
|
||||||
token++;
|
token++;
|
||||||
|
|
||||||
*value = token;
|
*value = token;
|
||||||
|
|||||||
100
src/odbc/odbc.c
100
src/odbc/odbc.c
@@ -32,7 +32,7 @@
|
|||||||
|
|
||||||
#include "connectparams.h"
|
#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,
|
static void *no_unused_var_warn[] = {software_version,
|
||||||
no_unused_var_warn};
|
no_unused_var_warn};
|
||||||
|
|
||||||
@@ -527,12 +527,19 @@ SQLRETURN SQL_API SQLColAttributes(
|
|||||||
SQLINTEGER FAR *pfDesc)
|
SQLINTEGER FAR *pfDesc)
|
||||||
{
|
{
|
||||||
int cplen, len = 0;
|
int cplen, len = 0;
|
||||||
|
int namelen, i;
|
||||||
struct _hstmt *stmt;
|
struct _hstmt *stmt;
|
||||||
struct _hdbc *dbc;
|
struct _hdbc *dbc;
|
||||||
|
struct _henv *env;
|
||||||
|
MdbSQL *sql;
|
||||||
|
MdbSQLColumn *sqlcol;
|
||||||
|
MdbColumn *col;
|
||||||
|
MdbTableDef *table;
|
||||||
|
|
||||||
stmt = (struct _hstmt *) hstmt;
|
stmt = (struct _hstmt *) hstmt;
|
||||||
dbc = (struct _hdbc *) stmt->hdbc;
|
dbc = (struct _hdbc *) stmt->hdbc;
|
||||||
|
env = (struct _henv *) dbc->henv;
|
||||||
|
sql = env->sql;
|
||||||
|
|
||||||
/* dont check column index for these */
|
/* dont check column index for these */
|
||||||
switch(fDescType) {
|
switch(fDescType) {
|
||||||
@@ -541,17 +548,38 @@ struct _hdbc *dbc;
|
|||||||
break;
|
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) {
|
switch(fDescType) {
|
||||||
case SQL_COLUMN_NAME:
|
case SQL_COLUMN_NAME:
|
||||||
|
case SQL_COLUMN_LABEL:
|
||||||
|
namelen = MIN(cbDescMax,strlen(sqlcol->name));
|
||||||
|
strncpy(rgbDesc, sqlcol->name, namelen);
|
||||||
|
*((char *)&rgbDesc[namelen])='\0';
|
||||||
break;
|
break;
|
||||||
case SQL_COLUMN_TYPE:
|
case SQL_COLUMN_TYPE:
|
||||||
|
*pcbDesc = SQL_CHAR;
|
||||||
break;
|
break;
|
||||||
case SQL_COLUMN_LENGTH:
|
case SQL_COLUMN_LENGTH:
|
||||||
break;
|
break;
|
||||||
case SQL_COLUMN_DISPLAY_SIZE:
|
//case SQL_COLUMN_DISPLAY_SIZE:
|
||||||
switch(_odbc_get_client_type(1)) {
|
case SQL_DESC_DISPLAY_SIZE:
|
||||||
|
switch(_odbc_get_client_type(col->col_type)) {
|
||||||
case SQL_CHAR:
|
case SQL_CHAR:
|
||||||
case SQL_VARCHAR:
|
case SQL_VARCHAR:
|
||||||
|
*pfDesc = col->col_size;
|
||||||
break;
|
break;
|
||||||
case SQL_INTEGER:
|
case SQL_INTEGER:
|
||||||
*pfDesc = 8;
|
*pfDesc = 8;
|
||||||
@@ -562,6 +590,9 @@ struct _hdbc *dbc;
|
|||||||
case SQL_TINYINT:
|
case SQL_TINYINT:
|
||||||
*pfDesc = 4;
|
*pfDesc = 4;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
//fprintf(stderr,"\nUnknown type %d\n", _odbc_get_client_type(col->col_type));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -657,6 +688,7 @@ struct _hdbc *dbc = (struct _hdbc *) stmt->hdbc;
|
|||||||
struct _henv *env = (struct _henv *) dbc->henv;
|
struct _henv *env = (struct _henv *) dbc->henv;
|
||||||
|
|
||||||
if (mdb_fetch_row(env->sql->cur_table)) {
|
if (mdb_fetch_row(env->sql->cur_table)) {
|
||||||
|
stmt->row_affected++;
|
||||||
return SQL_SUCCESS;
|
return SQL_SUCCESS;
|
||||||
} else {
|
} else {
|
||||||
return SQL_NO_DATA_FOUND;
|
return SQL_NO_DATA_FOUND;
|
||||||
@@ -765,7 +797,7 @@ SQLRETURN SQL_API SQLPrepare(
|
|||||||
SQLCHAR FAR *szSqlStr,
|
SQLCHAR FAR *szSqlStr,
|
||||||
SQLINTEGER cbSqlStr)
|
SQLINTEGER cbSqlStr)
|
||||||
{
|
{
|
||||||
struct _hstmt *stmt=(struct _hstmt *)hstmt;
|
struct _hstmt *stmt=(struct _hstmt *)hstmt;
|
||||||
|
|
||||||
if (cbSqlStr!=SQL_NTS) {
|
if (cbSqlStr!=SQL_NTS) {
|
||||||
strncpy(stmt->query, szSqlStr, cbSqlStr);
|
strncpy(stmt->query, szSqlStr, cbSqlStr);
|
||||||
@@ -781,6 +813,9 @@ SQLRETURN SQL_API SQLRowCount(
|
|||||||
SQLHSTMT hstmt,
|
SQLHSTMT hstmt,
|
||||||
SQLINTEGER FAR *pcrow)
|
SQLINTEGER FAR *pcrow)
|
||||||
{
|
{
|
||||||
|
struct _hstmt *stmt=(struct _hstmt *)hstmt;
|
||||||
|
|
||||||
|
*pcrow = stmt->row_affected;
|
||||||
return SQL_SUCCESS;
|
return SQL_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -845,10 +880,41 @@ SQLRETURN SQL_API SQLGetData(
|
|||||||
SQLINTEGER FAR *pcbValue)
|
SQLINTEGER FAR *pcbValue)
|
||||||
{
|
{
|
||||||
struct _hstmt *stmt;
|
struct _hstmt *stmt;
|
||||||
|
struct _hdbc *dbc;
|
||||||
|
struct _henv *env;
|
||||||
unsigned char *src;
|
unsigned char *src;
|
||||||
int srclen;
|
int srclen;
|
||||||
|
MdbSQL *sql;
|
||||||
|
MdbHandle *mdb;
|
||||||
|
MdbSQLColumn *sqlcol;
|
||||||
|
MdbColumn *col;
|
||||||
|
MdbTableDef *table;
|
||||||
|
int i;
|
||||||
|
|
||||||
stmt = (struct _hstmt *) hstmt;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1100,20 +1166,30 @@ static int _odbc_get_server_type(int clt_type)
|
|||||||
static SQLSMALLINT _odbc_get_client_type(int srv_type)
|
static SQLSMALLINT _odbc_get_client_type(int srv_type)
|
||||||
{
|
{
|
||||||
switch (srv_type) {
|
switch (srv_type) {
|
||||||
MDB_BOOL:
|
case MDB_BOOL:
|
||||||
return SQL_BIT;
|
return SQL_BIT;
|
||||||
MDB_BYTE:
|
break;
|
||||||
|
case MDB_BYTE:
|
||||||
return SQL_TINYINT;
|
return SQL_TINYINT;
|
||||||
MDB_INT:
|
break;
|
||||||
|
case MDB_INT:
|
||||||
return SQL_SMALLINT;
|
return SQL_SMALLINT;
|
||||||
MDB_LONGINT:
|
break;
|
||||||
|
case MDB_LONGINT:
|
||||||
return SQL_INTEGER;
|
return SQL_INTEGER;
|
||||||
MDB_FLOAT:
|
break;
|
||||||
|
case MDB_FLOAT:
|
||||||
return SQL_FLOAT;
|
return SQL_FLOAT;
|
||||||
MDB_DOUBLE:
|
break;
|
||||||
|
case MDB_DOUBLE:
|
||||||
return SQL_DOUBLE;
|
return SQL_DOUBLE;
|
||||||
MDB_TEXT:
|
break;
|
||||||
|
case MDB_TEXT:
|
||||||
return SQL_VARCHAR;
|
return SQL_VARCHAR;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// fprintf(stderr,"Unknown type %d\n",srv_type);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ MAKEINFO = makeinfo
|
|||||||
NM = /usr/bin/nm -B
|
NM = /usr/bin/nm -B
|
||||||
OBJDUMP = @OBJDUMP@
|
OBJDUMP = @OBJDUMP@
|
||||||
ODBC =
|
ODBC =
|
||||||
ODBC_INC =
|
ODBC_INC = /usr/local/include
|
||||||
PACKAGE = mdbtools
|
PACKAGE = mdbtools
|
||||||
RANLIB = ranlib
|
RANLIB = ranlib
|
||||||
READLINE_LIBS = -lncurses -lreadline
|
READLINE_LIBS = -lncurses -lreadline
|
||||||
@@ -96,7 +96,7 @@ libmdbsql_la_LIBADD =
|
|||||||
libmdbsql_la_OBJECTS = mdbsql.lo parser.lo lexer.lo
|
libmdbsql_la_OBJECTS = mdbsql.lo parser.lo lexer.lo
|
||||||
LEX_OUTPUT_ROOT = lex.yy
|
LEX_OUTPUT_ROOT = lex.yy
|
||||||
LEXLIB = -lfl
|
LEXLIB = -lfl
|
||||||
CFLAGS = -g -O2 -DSQL
|
CFLAGS = -g -O2 -DUNIXODBC -DSQL
|
||||||
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||||
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||||
CCLD = $(CC)
|
CCLD = $(CC)
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ MAKEINFO = makeinfo
|
|||||||
NM = /usr/bin/nm -B
|
NM = /usr/bin/nm -B
|
||||||
OBJDUMP = @OBJDUMP@
|
OBJDUMP = @OBJDUMP@
|
||||||
ODBC =
|
ODBC =
|
||||||
ODBC_INC =
|
ODBC_INC = /usr/local/include
|
||||||
PACKAGE = mdbtools
|
PACKAGE = mdbtools
|
||||||
RANLIB = ranlib
|
RANLIB = ranlib
|
||||||
READLINE_LIBS = -lncurses -lreadline
|
READLINE_LIBS = -lncurses -lreadline
|
||||||
@@ -156,7 +156,7 @@ prdump_OBJECTS = prdump.o
|
|||||||
prdump_LDADD = $(LDADD)
|
prdump_LDADD = $(LDADD)
|
||||||
prdump_DEPENDENCIES = ../libmdb/libmdb.la
|
prdump_DEPENDENCIES = ../libmdb/libmdb.la
|
||||||
prdump_LDFLAGS =
|
prdump_LDFLAGS =
|
||||||
CFLAGS = -g -O2 -DSQL
|
CFLAGS = -g -O2 -DUNIXODBC -DSQL
|
||||||
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||||
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||||
CCLD = $(CC)
|
CCLD = $(CC)
|
||||||
|
|||||||
Reference in New Issue
Block a user