diff --git a/include/mdbtools.h b/include/mdbtools.h index 21d3be3..d9a5e23 100644 --- a/include/mdbtools.h +++ b/include/mdbtools.h @@ -544,6 +544,10 @@ void mdb_set_boolean_fmt_words(MdbHandle *mdb); void mdb_set_boolean_fmt_numbers(MdbHandle *mdb); int mdb_read_row(MdbTableDef *table, unsigned int row); +/* money.c */ +char *mdb_money_to_string(MdbHandle *mdb, int start); +char *mdb_numeric_to_string(MdbHandle *mdb, int start, int scale, int prec); + /* dump.c */ void mdb_buffer_dump(const void *buf, off_t start, size_t len); diff --git a/src/libmdb/data.c b/src/libmdb/data.c index fdbc453..0679a53 100644 --- a/src/libmdb/data.c +++ b/src/libmdb/data.c @@ -24,9 +24,6 @@ #define OFFSET_MASK 0x1fff #define OLE_BUFFER_SIZE (MDB_BIND_SIZE*64) -char *mdb_money_to_string(MdbHandle *mdb, int start); -char *mdb_numeric_to_string(MdbHandle *mdb, int start, int prec, int scale); - static int _mdb_attempt_bind(MdbHandle *mdb, MdbColumn *col, unsigned char isnull, int offset, int len); static char *mdb_date_to_string(MdbHandle *mdb, const char *fmt, void *buf, int start); @@ -1000,9 +997,11 @@ char *mdb_col_to_string(MdbHandle *mdb, void *buf, int start, int datatype, int double td; switch (datatype) { + case MDB_NUMERIC: case MDB_BOOL: /* shouldn't happen. bools are handled specially ** by mdb_xfer_bound_bool() */ + fprintf(stderr, "Warning: mdb_col_to_string called on an unsupported data type.\n"); break; case MDB_BYTE: text = g_strdup_printf("%d", mdb_get_byte(buf, start)); @@ -1050,7 +1049,6 @@ char *mdb_col_to_string(MdbHandle *mdb, void *buf, int start, int datatype, int break; case MDB_MONEY: text = mdb_money_to_string(mdb, start); - case MDB_NUMERIC: break; case MDB_REPID: text = mdb_uuid_to_string(mdb->pg_buf, start); diff --git a/src/odbc/odbc.c b/src/odbc/odbc.c index 0becbdc..7e170c6 100644 --- a/src/odbc/odbc.c +++ b/src/odbc/odbc.c @@ -1662,8 +1662,14 @@ SQLRETURN SQL_API SQLGetData( strcpy(stmt->sqlState, "HY090"); // Invalid string or buffer length return SQL_ERROR; } - char *str = mdb_col_to_string(mdb, mdb->pg_buf, - col->cur_value_start, col->col_type, col->cur_value_len); + char *str = NULL; + if (col->col_type == MDB_NUMERIC) { + str = mdb_numeric_to_string(mdb, col->cur_value_start, + col->col_scale, col->col_prec); + } else { + str = mdb_col_to_string(mdb, mdb->pg_buf, + col->cur_value_start, col->col_type, col->cur_value_len); + } size_t len = strlen(str); if (stmt->pos >= len) {