mirror of
https://github.com/mdbtools/mdbtools.git
synced 2025-11-26 02:09:49 +08:00
fix bug #903498
This commit is contained in:
@@ -1,3 +1,11 @@
|
|||||||
|
Sat Mar 6 18:10:20 EST 2004 Brian Bruns <brian@bruns.com>
|
||||||
|
* include/mdbsql.h:
|
||||||
|
* src/libmdb/worktable.c:
|
||||||
|
* src/sql/mdbsql.c: introduced convience functions for building temp tables
|
||||||
|
* src/libmdb/write.c: remove dead statement
|
||||||
|
* src/libmdb/iconv.c: check for null string in mdb_ascii2unicode
|
||||||
|
* src/odbc/odbc.c: implement SQLGetTypeInfo bug #903498
|
||||||
|
|
||||||
Fri Mar 5 23:24:04 EST 2004 Brian Bruns <brian@bruns.com>
|
Fri Mar 5 23:24:04 EST 2004 Brian Bruns <brian@bruns.com>
|
||||||
* configure.in: AC_SUBST on ODBCINSTLIB
|
* configure.in: AC_SUBST on ODBCINSTLIB
|
||||||
* include/mdbtools.h:
|
* include/mdbtools.h:
|
||||||
|
|||||||
@@ -74,5 +74,8 @@ extern void mdb_sql_set_maxrow(MdbSQL *sql, int maxrow);
|
|||||||
extern int mdb_sql_eval_expr(MdbSQL *sql, char *const1, int op, char *const2);
|
extern int mdb_sql_eval_expr(MdbSQL *sql, char *const1, int op, char *const2);
|
||||||
extern void mdb_sql_bind_all(MdbSQL *sql);
|
extern void mdb_sql_bind_all(MdbSQL *sql);
|
||||||
extern int mdb_sql_fetch_row(MdbSQL *sql, MdbTableDef *table);
|
extern int mdb_sql_fetch_row(MdbSQL *sql, MdbTableDef *table);
|
||||||
|
extern int mdb_sql_add_temp_col(MdbSQL *sql, MdbTableDef *ttable, int col_num, char *name, int col_type, int col_size, int is_fixed);
|
||||||
|
extern void mdb_sql_bind_column(MdbSQL *sql, int colnum, char *varaddr);
|
||||||
|
extern void mdb_sql_bind_len(MdbSQL *sql, int colnum, int *len_ptr);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -436,6 +436,7 @@ extern void mdb_bind_len(MdbTableDef *table, int col_num, int *len_ptr);
|
|||||||
extern int mdb_ole_read_next(MdbHandle *mdb, MdbColumn *col, void *ole_ptr);
|
extern int mdb_ole_read_next(MdbHandle *mdb, MdbColumn *col, void *ole_ptr);
|
||||||
extern int mdb_ole_read(MdbHandle *mdb, MdbColumn *col, void *ole_ptr, int chunk_size);
|
extern int mdb_ole_read(MdbHandle *mdb, MdbColumn *col, void *ole_ptr, int chunk_size);
|
||||||
extern void mdb_set_date_fmt(const char *);
|
extern void mdb_set_date_fmt(const char *);
|
||||||
|
extern int mdb_read_row(MdbTableDef *table, int row);
|
||||||
|
|
||||||
/* dump.c */
|
/* dump.c */
|
||||||
extern void buffer_dump(const unsigned char* buf, int start, int end);
|
extern void buffer_dump(const unsigned char* buf, int start, int end);
|
||||||
@@ -499,6 +500,8 @@ extern MdbProperties *mdb_read_props(MdbHandle *mdb, GPtrArray *names, gchar *kk
|
|||||||
/* worktable.c */
|
/* worktable.c */
|
||||||
extern MdbTableDef *mdb_create_temp_table(MdbHandle *mdb, char *name);
|
extern MdbTableDef *mdb_create_temp_table(MdbHandle *mdb, char *name);
|
||||||
extern void mdb_temp_table_add_col(MdbTableDef *table, MdbColumn *col);
|
extern void mdb_temp_table_add_col(MdbTableDef *table, MdbColumn *col);
|
||||||
|
extern void mdb_fill_temp_col(MdbColumn *tcol, char *col_name, int col_size, int col_type, int is_fixed);
|
||||||
|
extern void mdb_fill_temp_field(MdbField *field, void *value, int siz, int is_fixed, int is_null, int start, int column);
|
||||||
|
|
||||||
/* options.c */
|
/* options.c */
|
||||||
extern int mdb_get_option(unsigned long optnum);
|
extern int mdb_get_option(unsigned long optnum);
|
||||||
|
|||||||
@@ -45,6 +45,8 @@ mdb_ascii2unicode(MdbHandle *mdb, unsigned char *buf, int offset, int len, char
|
|||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
|
if (!buf) return 0;
|
||||||
|
|
||||||
if (IS_JET3(mdb)) {
|
if (IS_JET3(mdb)) {
|
||||||
strncpy(dest, &buf[offset], len);
|
strncpy(dest, &buf[offset], len);
|
||||||
dest[len]='\0';
|
dest[len]='\0';
|
||||||
|
|||||||
@@ -28,6 +28,25 @@
|
|||||||
* commands like "list tables" and "describe table"
|
* commands like "list tables" and "describe table"
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
void
|
||||||
|
mdb_fill_temp_col(MdbColumn *tcol, char *col_name, int col_size, int col_type, int is_fixed)
|
||||||
|
{
|
||||||
|
memset(tcol,0,sizeof(MdbColumn));
|
||||||
|
strcpy(tcol->name, col_name);
|
||||||
|
tcol->col_size = col_size;
|
||||||
|
tcol->col_type = col_type;
|
||||||
|
tcol->is_fixed = is_fixed;
|
||||||
|
}
|
||||||
|
void
|
||||||
|
mdb_fill_temp_field(MdbField *field, void *value, int siz, int is_fixed, int is_null, int start, int colnum)
|
||||||
|
{
|
||||||
|
field->value = value;
|
||||||
|
field->siz = siz;
|
||||||
|
field->is_fixed = is_fixed;
|
||||||
|
field->is_null = is_null;
|
||||||
|
field->start = start;
|
||||||
|
field->colnum = colnum;
|
||||||
|
}
|
||||||
MdbTableDef *
|
MdbTableDef *
|
||||||
mdb_create_temp_table(MdbHandle *mdb, char *name)
|
mdb_create_temp_table(MdbHandle *mdb, char *name)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -145,8 +145,6 @@ mdb_crack_row4(MdbTableDef *table, int row_start, int row_end, MdbField *fields)
|
|||||||
/* find the end of data pointer */
|
/* find the end of data pointer */
|
||||||
eod = mdb_pg_get_int16(mdb, row_end - 3 - var_cols*2 - bitmask_sz);
|
eod = mdb_pg_get_int16(mdb, row_end - 3 - var_cols*2 - bitmask_sz);
|
||||||
|
|
||||||
col_start = 2;
|
|
||||||
|
|
||||||
/* actual cols on this row */
|
/* actual cols on this row */
|
||||||
fixed_cols_found = 0;
|
fixed_cols_found = 0;
|
||||||
var_cols_found = 0;
|
var_cols_found = 0;
|
||||||
|
|||||||
217
src/odbc/odbc.c
217
src/odbc/odbc.c
@@ -32,7 +32,7 @@
|
|||||||
|
|
||||||
#include "connectparams.h"
|
#include "connectparams.h"
|
||||||
|
|
||||||
static char software_version[] = "$Id: odbc.c,v 1.13 2004/03/06 05:13:28 brianb Exp $";
|
static char software_version[] = "$Id: odbc.c,v 1.14 2004/03/06 23:59: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};
|
||||||
|
|
||||||
@@ -58,6 +58,45 @@ static char lastError[_MAX_ERROR_LEN+1];
|
|||||||
//#define TRACE(x) fprintf(stderr,"Function %s\n", x);
|
//#define TRACE(x) fprintf(stderr,"Function %s\n", x);
|
||||||
#define TRACE(x)
|
#define TRACE(x)
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
SQLCHAR *type_name;
|
||||||
|
SQLSMALLINT data_type;
|
||||||
|
SQLINTEGER column_size;
|
||||||
|
SQLCHAR *literal_prefix;
|
||||||
|
SQLCHAR *literal_suffix;
|
||||||
|
SQLCHAR *create_params;
|
||||||
|
SQLSMALLINT nullable;
|
||||||
|
SQLSMALLINT case_sensitive;
|
||||||
|
SQLSMALLINT searchable;
|
||||||
|
SQLSMALLINT unsigned_attribute;
|
||||||
|
SQLSMALLINT fixed_prec_scale;
|
||||||
|
SQLSMALLINT auto_unique_value;
|
||||||
|
SQLCHAR *local_type_name;
|
||||||
|
SQLSMALLINT minimum_scale;
|
||||||
|
SQLSMALLINT maximum_scale;
|
||||||
|
SQLSMALLINT sql_data_type;
|
||||||
|
SQLSMALLINT sql_datetime_sub;
|
||||||
|
SQLSMALLINT num_prec_radix;
|
||||||
|
SQLSMALLINT interval_precision;
|
||||||
|
} TypeInfo;
|
||||||
|
|
||||||
|
TypeInfo type_info[] = {
|
||||||
|
{"text", SQL_VARCHAR, 255, NULL, NULL, NULL, SQL_TRUE, SQL_TRUE, SQL_TRUE, NULL, SQL_FALSE, SQL_FALSE, NULL, 0, 255, SQL_VARCHAR, NULL, NULL, NULL},
|
||||||
|
{"memo", SQL_VARCHAR, 4096, NULL, NULL, NULL, SQL_TRUE, SQL_TRUE, SQL_TRUE, NULL, SQL_FALSE, SQL_FALSE, NULL, 0, 4096, SQL_VARCHAR, NULL, NULL, NULL},
|
||||||
|
{"text", SQL_CHAR, 255, NULL, NULL, NULL, SQL_TRUE, SQL_TRUE, SQL_TRUE, NULL, SQL_FALSE, SQL_FALSE, NULL, 0, 255, SQL_CHAR, NULL, NULL, NULL},
|
||||||
|
{"numeric", SQL_NUMERIC, 255, NULL, NULL, NULL, SQL_TRUE, SQL_TRUE, SQL_TRUE, NULL, SQL_FALSE, SQL_FALSE, NULL, 0, 255, SQL_NUMERIC, NULL, NULL, NULL},
|
||||||
|
{"numeric", SQL_DECIMAL, 255, NULL, NULL, NULL, SQL_TRUE, SQL_TRUE, SQL_TRUE, NULL, SQL_FALSE, SQL_FALSE, NULL, 0, 255, SQL_DECIMAL, NULL, NULL, NULL},
|
||||||
|
{"long integer", SQL_INTEGER, 4, NULL, NULL, NULL, SQL_TRUE, SQL_TRUE, SQL_TRUE, NULL, SQL_FALSE, SQL_TRUE, NULL, 0, 4, SQL_INTEGER, NULL, NULL, NULL},
|
||||||
|
{"integer", SQL_SMALLINT, 4, NULL, NULL, NULL, SQL_TRUE, SQL_TRUE, SQL_TRUE, NULL, SQL_FALSE, SQL_TRUE, NULL, 0, 4, SQL_SMALLINT, NULL, NULL, NULL},
|
||||||
|
{"integer", SQL_SMALLINT, 4, NULL, NULL, NULL, SQL_TRUE, SQL_TRUE, SQL_TRUE, NULL, SQL_FALSE, SQL_TRUE, NULL, 0, 4, SQL_SMALLINT, NULL, NULL, NULL},
|
||||||
|
{"single", SQL_REAL, 4, NULL, NULL, NULL, SQL_TRUE, SQL_TRUE, SQL_TRUE, NULL, SQL_FALSE, SQL_TRUE, NULL, 0, 4, SQL_REAL, NULL, NULL, NULL},
|
||||||
|
{"double", SQL_DOUBLE, 8, NULL, NULL, NULL, SQL_TRUE, SQL_TRUE, SQL_TRUE, NULL, SQL_FALSE, SQL_TRUE, NULL, 0, 8, SQL_FLOAT, NULL, NULL, NULL},
|
||||||
|
{"datetime", SQL_DATETIME, 8, NULL, NULL, NULL, SQL_TRUE, SQL_TRUE, SQL_TRUE, NULL, SQL_FALSE, SQL_TRUE, NULL, 0, 8, SQL_DATETIME, NULL, NULL, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
#define NUM_TYPE_INFO_COLS 19
|
||||||
|
#define MAX_TYPE_INFO 11
|
||||||
|
|
||||||
/* The SQL engine is presently non-reenterrant and non-thread safe.
|
/* The SQL engine is presently non-reenterrant and non-thread safe.
|
||||||
See _SQLExecute for details.
|
See _SQLExecute for details.
|
||||||
*/
|
*/
|
||||||
@@ -423,7 +462,7 @@ static SQLRETURN SQL_API _SQLAllocEnv(
|
|||||||
struct _henv *env;
|
struct _henv *env;
|
||||||
|
|
||||||
TRACE("_SQLAllocEnv");
|
TRACE("_SQLAllocEnv");
|
||||||
env = (SQLHENV) malloc(sizeof(struct _henv));
|
env = (SQLHENV) g_malloc(sizeof(struct _henv));
|
||||||
memset(env,'\0',sizeof(struct _henv));
|
memset(env,'\0',sizeof(struct _henv));
|
||||||
*phenv=env;
|
*phenv=env;
|
||||||
env->sql = mdb_sql_init();
|
env->sql = mdb_sql_init();
|
||||||
@@ -446,7 +485,7 @@ struct _hstmt *stmt;
|
|||||||
TRACE("_SQLAllocStmt");
|
TRACE("_SQLAllocStmt");
|
||||||
dbc = (struct _hdbc *) hdbc;
|
dbc = (struct _hdbc *) hdbc;
|
||||||
|
|
||||||
stmt = (SQLHSTMT) malloc(sizeof(struct _hstmt));
|
stmt = (SQLHSTMT) g_malloc(sizeof(struct _hstmt));
|
||||||
memset(stmt,'\0',sizeof(struct _hstmt));
|
memset(stmt,'\0',sizeof(struct _hstmt));
|
||||||
stmt->hdbc=hdbc;
|
stmt->hdbc=hdbc;
|
||||||
*phstmt = stmt;
|
*phstmt = stmt;
|
||||||
@@ -469,10 +508,8 @@ SQLRETURN SQL_API SQLBindCol(
|
|||||||
SQLINTEGER cbValueMax,
|
SQLINTEGER cbValueMax,
|
||||||
SQLINTEGER FAR *pcbValue)
|
SQLINTEGER FAR *pcbValue)
|
||||||
{
|
{
|
||||||
struct _hstmt *stmt = (struct _hstmt *) hstmt;
|
struct _hstmt *stmt = (struct _hstmt *) hstmt;
|
||||||
struct _hdbc *dbc = (struct _hdbc *) stmt->hdbc;
|
struct _sql_bind_info *cur, *prev, *newitem;
|
||||||
struct _henv *env = (struct _henv *) dbc->henv;
|
|
||||||
struct _sql_bind_info *cur, *prev, *newitem;
|
|
||||||
|
|
||||||
TRACE("SQLBindCol");
|
TRACE("SQLBindCol");
|
||||||
/* find available item in list */
|
/* find available item in list */
|
||||||
@@ -494,7 +531,7 @@ struct _sql_bind_info *cur, *prev, *newitem;
|
|||||||
newitem->column_number = icol;
|
newitem->column_number = icol;
|
||||||
newitem->column_bindtype = fCType;
|
newitem->column_bindtype = fCType;
|
||||||
newitem->column_bindlen = cbValueMax;
|
newitem->column_bindlen = cbValueMax;
|
||||||
newitem->column_lenbind = pcbValue;
|
newitem->column_lenbind = (int *)pcbValue;
|
||||||
newitem->varaddr = (char *) rgbValue;
|
newitem->varaddr = (char *) rgbValue;
|
||||||
/* if there's no head yet */
|
/* if there's no head yet */
|
||||||
if (! stmt->bind_head) {
|
if (! stmt->bind_head) {
|
||||||
@@ -564,14 +601,14 @@ SQLRETURN SQL_API SQLDescribeCol(
|
|||||||
SQLSMALLINT FAR *pibScale,
|
SQLSMALLINT FAR *pibScale,
|
||||||
SQLSMALLINT FAR *pfNullable)
|
SQLSMALLINT FAR *pfNullable)
|
||||||
{
|
{
|
||||||
int cplen, namelen, i;
|
int namelen, i;
|
||||||
struct _hstmt *stmt = (struct _hstmt *) hstmt;
|
struct _hstmt *stmt = (struct _hstmt *) hstmt;
|
||||||
struct _hdbc *dbc = (struct _hdbc *) stmt->hdbc;
|
struct _hdbc *dbc = (struct _hdbc *) stmt->hdbc;
|
||||||
struct _henv *env = (struct _henv *) dbc->henv;
|
struct _henv *env = (struct _henv *) dbc->henv;
|
||||||
MdbSQL *sql = env->sql;
|
MdbSQL *sql = env->sql;
|
||||||
MdbSQLColumn *sqlcol;
|
MdbSQLColumn *sqlcol;
|
||||||
MdbColumn *col;
|
MdbColumn *col;
|
||||||
MdbTableDef *table;
|
MdbTableDef *table;
|
||||||
|
|
||||||
TRACE("SQLDescribeCol");
|
TRACE("SQLDescribeCol");
|
||||||
if (icol<1 || icol>sql->num_columns) {
|
if (icol<1 || icol>sql->num_columns) {
|
||||||
@@ -617,15 +654,14 @@ SQLRETURN SQL_API SQLColAttributes(
|
|||||||
SQLSMALLINT FAR *pcbDesc,
|
SQLSMALLINT FAR *pcbDesc,
|
||||||
SQLINTEGER FAR *pfDesc)
|
SQLINTEGER FAR *pfDesc)
|
||||||
{
|
{
|
||||||
int cplen, len = 0;
|
int namelen, i;
|
||||||
int namelen, i;
|
struct _hstmt *stmt;
|
||||||
struct _hstmt *stmt;
|
struct _hdbc *dbc;
|
||||||
struct _hdbc *dbc;
|
struct _henv *env;
|
||||||
struct _henv *env;
|
MdbSQL *sql;
|
||||||
MdbSQL *sql;
|
MdbSQLColumn *sqlcol;
|
||||||
MdbSQLColumn *sqlcol;
|
MdbColumn *col;
|
||||||
MdbColumn *col;
|
MdbTableDef *table;
|
||||||
MdbTableDef *table;
|
|
||||||
|
|
||||||
TRACE("SQLColAttributes");
|
TRACE("SQLColAttributes");
|
||||||
stmt = (struct _hstmt *) hstmt;
|
stmt = (struct _hstmt *) hstmt;
|
||||||
@@ -731,10 +767,10 @@ SQLRETURN SQL_API SQLError(
|
|||||||
|
|
||||||
static SQLRETURN SQL_API _SQLExecute( SQLHSTMT hstmt)
|
static SQLRETURN SQL_API _SQLExecute( SQLHSTMT hstmt)
|
||||||
{
|
{
|
||||||
struct _hstmt *stmt = (struct _hstmt *) hstmt;
|
struct _hstmt *stmt = (struct _hstmt *) hstmt;
|
||||||
struct _hdbc *dbc = (struct _hdbc *) stmt->hdbc;
|
struct _hdbc *dbc = (struct _hdbc *) stmt->hdbc;
|
||||||
struct _henv *env = (struct _henv *) dbc->henv;
|
struct _henv *env = (struct _henv *) dbc->henv;
|
||||||
int ret;
|
|
||||||
TRACE("_SQLExecute");
|
TRACE("_SQLExecute");
|
||||||
|
|
||||||
/* fprintf(stderr,"query = %s\n",stmt->query); */
|
/* fprintf(stderr,"query = %s\n",stmt->query); */
|
||||||
@@ -762,13 +798,12 @@ SQLRETURN SQL_API SQLExecDirect(
|
|||||||
SQLCHAR FAR *szSqlStr,
|
SQLCHAR FAR *szSqlStr,
|
||||||
SQLINTEGER cbSqlStr)
|
SQLINTEGER cbSqlStr)
|
||||||
{
|
{
|
||||||
struct _hstmt *stmt = (struct _hstmt *) hstmt;
|
struct _hstmt *stmt = (struct _hstmt *) hstmt;
|
||||||
int ret;
|
|
||||||
|
|
||||||
TRACE("SQLExecDirect");
|
TRACE("SQLExecDirect");
|
||||||
strcpy(stmt->query, szSqlStr);
|
strcpy(stmt->query, szSqlStr);
|
||||||
|
|
||||||
return _SQLExecute(hstmt);
|
return _SQLExecute(hstmt);
|
||||||
}
|
}
|
||||||
|
|
||||||
SQLRETURN SQL_API SQLExecute(
|
SQLRETURN SQL_API SQLExecute(
|
||||||
@@ -854,8 +889,8 @@ static SQLRETURN SQL_API _SQLFreeConnect(
|
|||||||
|
|
||||||
TRACE("_SQLFreeConnect");
|
TRACE("_SQLFreeConnect");
|
||||||
|
|
||||||
FreeConnectParams (dbc->params);
|
FreeConnectParams(dbc->params);
|
||||||
free (dbc);
|
g_free(dbc);
|
||||||
|
|
||||||
return SQL_SUCCESS;
|
return SQL_SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -883,15 +918,15 @@ static SQLRETURN SQL_API _SQLFreeStmt(
|
|||||||
SQLHSTMT hstmt,
|
SQLHSTMT hstmt,
|
||||||
SQLUSMALLINT fOption)
|
SQLUSMALLINT fOption)
|
||||||
{
|
{
|
||||||
struct _hstmt *stmt=(struct _hstmt *)hstmt;
|
struct _hstmt *stmt=(struct _hstmt *)hstmt;
|
||||||
|
|
||||||
TRACE("_SQLFreeStmt");
|
TRACE("_SQLFreeStmt");
|
||||||
if (fOption==SQL_DROP) {
|
if (fOption==SQL_DROP) {
|
||||||
free (hstmt);
|
g_free(stmt);
|
||||||
} else if (fOption==SQL_CLOSE) {
|
} else if (fOption==SQL_CLOSE) {
|
||||||
} else {
|
} else {
|
||||||
}
|
}
|
||||||
return SQL_SUCCESS;
|
return SQL_SUCCESS;
|
||||||
}
|
}
|
||||||
SQLRETURN SQL_API SQLFreeStmt(
|
SQLRETURN SQL_API SQLFreeStmt(
|
||||||
SQLHSTMT hstmt,
|
SQLHSTMT hstmt,
|
||||||
@@ -1029,17 +1064,15 @@ SQLRETURN SQL_API SQLGetData(
|
|||||||
SQLINTEGER cbValueMax,
|
SQLINTEGER cbValueMax,
|
||||||
SQLINTEGER FAR *pcbValue)
|
SQLINTEGER FAR *pcbValue)
|
||||||
{
|
{
|
||||||
struct _hstmt *stmt;
|
struct _hstmt *stmt;
|
||||||
struct _hdbc *dbc;
|
struct _hdbc *dbc;
|
||||||
struct _henv *env;
|
struct _henv *env;
|
||||||
unsigned char *src;
|
MdbSQL *sql;
|
||||||
int srclen;
|
MdbHandle *mdb;
|
||||||
MdbSQL *sql;
|
MdbSQLColumn *sqlcol;
|
||||||
MdbHandle *mdb;
|
MdbColumn *col;
|
||||||
MdbSQLColumn *sqlcol;
|
MdbTableDef *table;
|
||||||
MdbColumn *col;
|
int i;
|
||||||
MdbTableDef *table;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
TRACE("SQLGetData");
|
TRACE("SQLGetData");
|
||||||
stmt = (struct _hstmt *) hstmt;
|
stmt = (struct _hstmt *) hstmt;
|
||||||
@@ -1081,7 +1114,6 @@ SQLRETURN SQL_API SQLGetFunctions(
|
|||||||
SQLUSMALLINT fFunction,
|
SQLUSMALLINT fFunction,
|
||||||
SQLUSMALLINT FAR *pfExists)
|
SQLUSMALLINT FAR *pfExists)
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
|
|
||||||
TRACE("SQLGetFunctions");
|
TRACE("SQLGetFunctions");
|
||||||
switch (fFunction) {
|
switch (fFunction) {
|
||||||
@@ -1226,15 +1258,82 @@ SQLRETURN SQL_API SQLGetTypeInfo(
|
|||||||
SQLHSTMT hstmt,
|
SQLHSTMT hstmt,
|
||||||
SQLSMALLINT fSqlType)
|
SQLSMALLINT fSqlType)
|
||||||
{
|
{
|
||||||
struct _hstmt *stmt;
|
struct _hstmt *stmt = (struct _hstmt *) hstmt;
|
||||||
|
struct _hdbc *dbc = (struct _hdbc *) stmt->hdbc;
|
||||||
|
struct _henv *env = (struct _henv *) dbc->henv;
|
||||||
|
MdbTableDef *ttable;
|
||||||
|
MdbSQL *sql = env->sql;
|
||||||
|
MdbHandle *mdb = sql->mdb;
|
||||||
|
unsigned char *new_pg;
|
||||||
|
int row_size;
|
||||||
|
unsigned char *row_buffer[MDB_PGSIZE];
|
||||||
|
unsigned char *tmpstr[MDB_BIND_SIZE];
|
||||||
|
int i, tmpsiz;
|
||||||
|
MdbField fields[NUM_TYPE_INFO_COLS];
|
||||||
|
|
||||||
TRACE("SQLGetStmtOption");
|
TRACE("SQLGetStmtOption");
|
||||||
stmt = (struct _hstmt *) hstmt;
|
stmt = (struct _hstmt *) hstmt;
|
||||||
if (!fSqlType) {
|
|
||||||
strcpy(stmt->query, "SELECT * FROM typeinfo");
|
ttable = mdb_create_temp_table(mdb, "#typeinfo");
|
||||||
} else {
|
mdb_sql_add_temp_col(sql, ttable, 0, "TYPE_NAME", MDB_TEXT, 30, 0);
|
||||||
sprintf(stmt->query, "SELECT * FROM typeinfo WHERE SQL_DATA_TYPE = %d", fSqlType);
|
mdb_sql_add_temp_col(sql, ttable, 1, "DATA_TYPE", MDB_INT, 0, 1);
|
||||||
|
mdb_sql_add_temp_col(sql, ttable, 2, "COLUMN_SIZE", MDB_LONGINT, 0, 1);
|
||||||
|
mdb_sql_add_temp_col(sql, ttable, 3, "LITERAL_PREFIX", MDB_TEXT, 30, 0);
|
||||||
|
mdb_sql_add_temp_col(sql, ttable, 4, "LITERAL_SUFFIX", MDB_TEXT, 30, 0);
|
||||||
|
mdb_sql_add_temp_col(sql, ttable, 5, "CREATE_PARAMS", MDB_TEXT, 30, 0);
|
||||||
|
mdb_sql_add_temp_col(sql, ttable, 6, "NULLABLE", MDB_INT, 0, 1);
|
||||||
|
mdb_sql_add_temp_col(sql, ttable, 7, "CASE_SENSITIVE", MDB_INT, 0, 1);
|
||||||
|
mdb_sql_add_temp_col(sql, ttable, 8, "SEARCHABLE", MDB_INT, 0, 1);
|
||||||
|
mdb_sql_add_temp_col(sql, ttable, 9, "UNSIGNED_ATTRIBUTE", MDB_INT, 0, 1);
|
||||||
|
mdb_sql_add_temp_col(sql, ttable, 10, "FIXED_PREC_SCALE", MDB_INT, 0, 1);
|
||||||
|
mdb_sql_add_temp_col(sql, ttable, 11, "AUTO_UNIQUE_VALUE", MDB_INT, 0, 1);
|
||||||
|
mdb_sql_add_temp_col(sql, ttable, 12, "LOCAL_TYPE_NAME", MDB_TEXT, 30, 0);
|
||||||
|
mdb_sql_add_temp_col(sql, ttable, 13, "MINIMUM_SCALE", MDB_INT, 0, 1);
|
||||||
|
mdb_sql_add_temp_col(sql, ttable, 14, "MAXIMUM_SCALE", MDB_INT, 0, 1);
|
||||||
|
mdb_sql_add_temp_col(sql, ttable, 15, "SQL_DATA_TYPE", MDB_INT, 0, 1);
|
||||||
|
mdb_sql_add_temp_col(sql, ttable, 16, "SQL_DATETIME_SUB", MDB_INT, 0, 1);
|
||||||
|
mdb_sql_add_temp_col(sql, ttable, 17, "NUM_PREC_RADIX", MDB_INT, 0, 1);
|
||||||
|
mdb_sql_add_temp_col(sql, ttable, 18, "INTERVAL_PRECISION", MDB_INT, 0, 1);
|
||||||
|
|
||||||
|
/* blank out the pg_buf */
|
||||||
|
new_pg = mdb_new_data_pg(ttable->entry);
|
||||||
|
memcpy(mdb->pg_buf, new_pg, mdb->fmt->pg_size);
|
||||||
|
g_free(new_pg);
|
||||||
|
|
||||||
|
for (i=0; i<MAX_TYPE_INFO; i++) {
|
||||||
|
if (!fSqlType || fSqlType == type_info[i].data_type) {
|
||||||
|
tmpsiz = mdb_ascii2unicode(mdb, type_info[i].type_name, 0, 100, tmpstr);
|
||||||
|
mdb_fill_temp_field(&fields[0],tmpstr, tmpsiz, 0,0,0,0);
|
||||||
|
mdb_fill_temp_field(&fields[1],&type_info[i].data_type, sizeof(SQLSMALLINT), 0,0,0,1);
|
||||||
|
mdb_fill_temp_field(&fields[2],&type_info[i].column_size, sizeof(SQLINTEGER), 0,0,0,1);
|
||||||
|
tmpsiz = mdb_ascii2unicode(mdb, type_info[i].literal_prefix, 0, 100, tmpstr);
|
||||||
|
mdb_fill_temp_field(&fields[3], tmpstr, tmpsiz, 0,0,0,0);
|
||||||
|
tmpsiz = mdb_ascii2unicode(mdb, type_info[i].literal_suffix, 0, 100, tmpstr);
|
||||||
|
mdb_fill_temp_field(&fields[4], tmpstr, tmpsiz, 0,0,0,0);
|
||||||
|
tmpsiz = mdb_ascii2unicode(mdb, type_info[i].create_params, 0, 100, tmpstr);
|
||||||
|
mdb_fill_temp_field(&fields[5], tmpstr, tmpsiz, 0,0,0,0);
|
||||||
|
mdb_fill_temp_field(&fields[6],&type_info[i].nullable, sizeof(SQLSMALLINT), 0,0,0,1);
|
||||||
|
mdb_fill_temp_field(&fields[7],&type_info[i].case_sensitive, sizeof(SQLSMALLINT), 0,0,0,1);
|
||||||
|
mdb_fill_temp_field(&fields[8],&type_info[i].searchable, sizeof(SQLSMALLINT), 0,0,0,1);
|
||||||
|
mdb_fill_temp_field(&fields[9],&type_info[i].unsigned_attribute, sizeof(SQLSMALLINT), 0,0,0,1);
|
||||||
|
mdb_fill_temp_field(&fields[10],&type_info[i].fixed_prec_scale, sizeof(SQLSMALLINT), 0,0,0,1);
|
||||||
|
mdb_fill_temp_field(&fields[11],&type_info[i].auto_unique_value, sizeof(SQLSMALLINT), 0,0,0,1);
|
||||||
|
tmpsiz = mdb_ascii2unicode(mdb, type_info[i].local_type_name, 0, 100, tmpstr);
|
||||||
|
mdb_fill_temp_field(&fields[12], tmpstr, tmpsiz, 0,0,0,0);
|
||||||
|
mdb_fill_temp_field(&fields[13],&type_info[i].minimum_scale, sizeof(SQLSMALLINT), 0,0,0,1);
|
||||||
|
mdb_fill_temp_field(&fields[14],&type_info[i].maximum_scale, sizeof(SQLSMALLINT), 0,0,0,1);
|
||||||
|
mdb_fill_temp_field(&fields[15],&type_info[i].sql_data_type, sizeof(SQLSMALLINT), 0,0,0,1);
|
||||||
|
mdb_fill_temp_field(&fields[16],&type_info[i].sql_datetime_sub, sizeof(SQLSMALLINT), 0,0,0,1);
|
||||||
|
mdb_fill_temp_field(&fields[17],&type_info[i].num_prec_radix, sizeof(SQLSMALLINT), 0,0,0,1);
|
||||||
|
mdb_fill_temp_field(&fields[18],&type_info[i].interval_precision, sizeof(SQLSMALLINT), 0,0,0,1);
|
||||||
|
|
||||||
|
row_size = mdb_pack_row(ttable, row_buffer, NUM_TYPE_INFO_COLS, fields);
|
||||||
|
mdb_add_row_to_pg(ttable,row_buffer, row_size);
|
||||||
|
ttable->num_rows++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
sql->kludge_ttable_pg = g_memdup(mdb->pg_buf, mdb->fmt->pg_size);
|
||||||
|
sql->cur_table = ttable;
|
||||||
|
|
||||||
/* return _SQLExecute(hstmt); */
|
/* return _SQLExecute(hstmt); */
|
||||||
return SQL_SUCCESS;
|
return SQL_SUCCESS;
|
||||||
|
|||||||
114
src/sql/mdbsql.c
114
src/sql/mdbsql.c
@@ -527,27 +527,6 @@ int vlen;
|
|||||||
}
|
}
|
||||||
fprintf(stdout,"|");
|
fprintf(stdout,"|");
|
||||||
}
|
}
|
||||||
static gchar *
|
|
||||||
convert_to_ucs2(MdbHandle *mdb, gchar *text)
|
|
||||||
{
|
|
||||||
gchar *tmpstr;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
tmpstr = (gchar *) g_malloc((strlen(text)+1)*2);
|
|
||||||
if (IS_JET4(mdb)) {
|
|
||||||
/* sloppily convert to UCS2-LE */
|
|
||||||
for (i=0;i<strlen(text);i++) {
|
|
||||||
tmpstr[i*2]=text[i];
|
|
||||||
tmpstr[i*2+1]=0;
|
|
||||||
}
|
|
||||||
tmpstr[i*2]=0;
|
|
||||||
tmpstr[i*2+1]=0;
|
|
||||||
} else {
|
|
||||||
strcpy(tmpstr, text);
|
|
||||||
}
|
|
||||||
/* caller is responsible for freeing returned value */
|
|
||||||
return tmpstr;
|
|
||||||
}
|
|
||||||
void mdb_sql_listtables(MdbSQL *sql)
|
void mdb_sql_listtables(MdbSQL *sql)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@@ -558,8 +537,6 @@ void mdb_sql_listtables(MdbSQL *sql)
|
|||||||
unsigned char *new_pg;
|
unsigned char *new_pg;
|
||||||
int row_size;
|
int row_size;
|
||||||
MdbTableDef *ttable;
|
MdbTableDef *ttable;
|
||||||
MdbColumn tcol;
|
|
||||||
MdbSQLColumn *sqlcol;
|
|
||||||
gchar tmpstr[100];
|
gchar tmpstr[100];
|
||||||
int tmpsiz;
|
int tmpsiz;
|
||||||
|
|
||||||
@@ -570,16 +547,7 @@ void mdb_sql_listtables(MdbSQL *sql)
|
|||||||
mdb_read_catalog (mdb, MDB_TABLE);
|
mdb_read_catalog (mdb, MDB_TABLE);
|
||||||
|
|
||||||
ttable = mdb_create_temp_table(mdb, "#listtables");
|
ttable = mdb_create_temp_table(mdb, "#listtables");
|
||||||
|
mdb_sql_add_temp_col(sql, ttable, 0, "Tables", MDB_TEXT, 30, 0);
|
||||||
memset(&tcol,0,sizeof(MdbColumn));
|
|
||||||
strcpy(tcol.name, "Tables");
|
|
||||||
tcol.col_size = 30;
|
|
||||||
tcol.col_type = MDB_TEXT;
|
|
||||||
tcol.is_fixed = 0;
|
|
||||||
mdb_temp_table_add_col(ttable, &tcol);
|
|
||||||
mdb_sql_add_column(sql, "Tables");
|
|
||||||
sqlcol = g_ptr_array_index(sql->columns,0);
|
|
||||||
sqlcol->disp_size = mdb_col_disp_size(&tcol);
|
|
||||||
|
|
||||||
/* blank out the pg_buf */
|
/* blank out the pg_buf */
|
||||||
new_pg = mdb_new_data_pg(ttable->entry);
|
new_pg = mdb_new_data_pg(ttable->entry);
|
||||||
@@ -594,13 +562,7 @@ void mdb_sql_listtables(MdbSQL *sql)
|
|||||||
if (strncmp (entry->object_name, "MSys", 4)) {
|
if (strncmp (entry->object_name, "MSys", 4)) {
|
||||||
//col = g_ptr_array_index(table->columns,0);
|
//col = g_ptr_array_index(table->columns,0);
|
||||||
tmpsiz = mdb_ascii2unicode(mdb, entry->object_name, 0, 100, tmpstr);
|
tmpsiz = mdb_ascii2unicode(mdb, entry->object_name, 0, 100, tmpstr);
|
||||||
fields[0].value = tmpstr;
|
mdb_fill_temp_field(&fields[0],tmpstr, tmpsiz, 0,0,0,0);
|
||||||
fields[0].siz = tmpsiz;
|
|
||||||
fields[0].is_fixed = 0;
|
|
||||||
fields[0].is_null = 0;
|
|
||||||
fields[0].start = 0;
|
|
||||||
fields[0].colnum = 0;
|
|
||||||
|
|
||||||
row_size = mdb_pack_row(ttable, row_buffer, 1, fields);
|
row_size = mdb_pack_row(ttable, row_buffer, 1, fields);
|
||||||
mdb_add_row_to_pg(ttable,row_buffer, row_size);
|
mdb_add_row_to_pg(ttable,row_buffer, row_size);
|
||||||
ttable->num_rows++;
|
ttable->num_rows++;
|
||||||
@@ -611,18 +573,31 @@ void mdb_sql_listtables(MdbSQL *sql)
|
|||||||
sql->cur_table = ttable;
|
sql->cur_table = ttable;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
int
|
||||||
|
mdb_sql_add_temp_col(MdbSQL *sql, MdbTableDef *ttable, int col_num, char *name, int col_type, int col_size, int is_fixed)
|
||||||
|
{
|
||||||
|
MdbColumn tcol;
|
||||||
|
MdbSQLColumn *sqlcol;
|
||||||
|
|
||||||
|
mdb_fill_temp_col(&tcol, name, col_size, col_type, is_fixed);
|
||||||
|
mdb_temp_table_add_col(ttable, &tcol);
|
||||||
|
mdb_sql_add_column(sql, name);
|
||||||
|
sqlcol = g_ptr_array_index(sql->columns,col_num);
|
||||||
|
sqlcol->disp_size = mdb_col_disp_size(&tcol);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
void mdb_sql_describe_table(MdbSQL *sql)
|
void mdb_sql_describe_table(MdbSQL *sql)
|
||||||
{
|
{
|
||||||
MdbTableDef *ttable, *table = NULL;
|
MdbTableDef *ttable, *table = NULL;
|
||||||
MdbSQLTable *sql_tab;
|
MdbSQLTable *sql_tab;
|
||||||
MdbCatalogEntry *entry;
|
MdbCatalogEntry *entry;
|
||||||
MdbHandle *mdb = sql->mdb;
|
MdbHandle *mdb = sql->mdb;
|
||||||
MdbColumn *col, tcol;
|
MdbColumn *col;
|
||||||
MdbSQLColumn *sqlcol;
|
|
||||||
int i;
|
int i;
|
||||||
MdbField fields[4];
|
MdbField fields[4];
|
||||||
char tmpstr[256];
|
char tmpstr[256];
|
||||||
unsigned char row_buffer[4096];
|
unsigned char row_buffer[MDB_PGSIZE];
|
||||||
unsigned char *new_pg;
|
unsigned char *new_pg;
|
||||||
int row_size;
|
int row_size;
|
||||||
gchar col_name[100], col_type[100], col_size[100];
|
gchar col_name[100], col_type[100], col_size[100];
|
||||||
@@ -656,35 +631,9 @@ void mdb_sql_describe_table(MdbSQL *sql)
|
|||||||
|
|
||||||
ttable = mdb_create_temp_table(mdb, "#describe");
|
ttable = mdb_create_temp_table(mdb, "#describe");
|
||||||
|
|
||||||
memset(&tcol,0,sizeof(MdbColumn));
|
mdb_sql_add_temp_col(sql, ttable, 0, "Column Name", MDB_TEXT, 30, 0);
|
||||||
strcpy(tcol.name, "Column Name");
|
mdb_sql_add_temp_col(sql, ttable, 1, "Type", MDB_TEXT, 20, 0);
|
||||||
tcol.col_size = 30;
|
mdb_sql_add_temp_col(sql, ttable, 2, "Size", MDB_TEXT, 10, 0);
|
||||||
tcol.col_type = MDB_TEXT;
|
|
||||||
tcol.is_fixed = 0;
|
|
||||||
mdb_temp_table_add_col(ttable, &tcol);
|
|
||||||
mdb_sql_add_column(sql, "Column Name");
|
|
||||||
sqlcol = g_ptr_array_index(sql->columns,0);
|
|
||||||
sqlcol->disp_size = mdb_col_disp_size(&tcol);
|
|
||||||
|
|
||||||
memset(&tcol,0,sizeof(MdbColumn));
|
|
||||||
strcpy(tcol.name, "Type");
|
|
||||||
tcol.col_size = 20;
|
|
||||||
tcol.col_type = MDB_TEXT;
|
|
||||||
tcol.is_fixed = 0;
|
|
||||||
mdb_temp_table_add_col(ttable, &tcol);
|
|
||||||
mdb_sql_add_column(sql, "Type");
|
|
||||||
sqlcol = g_ptr_array_index(sql->columns,1);
|
|
||||||
sqlcol->disp_size = mdb_col_disp_size(&tcol);
|
|
||||||
|
|
||||||
memset(&tcol,0,sizeof(MdbColumn));
|
|
||||||
strcpy(tcol.name, "Size");
|
|
||||||
tcol.col_size = 10;
|
|
||||||
tcol.col_type = MDB_TEXT;
|
|
||||||
tcol.is_fixed = 0;
|
|
||||||
mdb_temp_table_add_col(ttable, &tcol);
|
|
||||||
mdb_sql_add_column(sql, "Size");
|
|
||||||
sqlcol = g_ptr_array_index(sql->columns,2);
|
|
||||||
sqlcol->disp_size = mdb_col_disp_size(&tcol);
|
|
||||||
|
|
||||||
/* blank out the pg_buf */
|
/* blank out the pg_buf */
|
||||||
new_pg = mdb_new_data_pg(ttable->entry);
|
new_pg = mdb_new_data_pg(ttable->entry);
|
||||||
@@ -695,30 +644,15 @@ void mdb_sql_describe_table(MdbSQL *sql)
|
|||||||
|
|
||||||
col = g_ptr_array_index(table->columns,i);
|
col = g_ptr_array_index(table->columns,i);
|
||||||
tmpsiz = mdb_ascii2unicode(mdb, col->name, 0, 100, col_name);
|
tmpsiz = mdb_ascii2unicode(mdb, col->name, 0, 100, col_name);
|
||||||
fields[0].value = col_name;
|
mdb_fill_temp_field(&fields[0],col_name, tmpsiz, 0,0,0,0);
|
||||||
fields[0].siz = tmpsiz;
|
|
||||||
fields[0].is_fixed = 0;
|
|
||||||
fields[0].is_null = 0;
|
|
||||||
fields[0].start = 0;
|
|
||||||
fields[0].colnum = 0;
|
|
||||||
|
|
||||||
strcpy(tmpstr, mdb_get_coltype_string(mdb->default_backend, col->col_type));
|
strcpy(tmpstr, mdb_get_coltype_string(mdb->default_backend, col->col_type));
|
||||||
tmpsiz = mdb_ascii2unicode(mdb, tmpstr, 0, 100, col_type);
|
tmpsiz = mdb_ascii2unicode(mdb, tmpstr, 0, 100, col_type);
|
||||||
fields[1].value = col_type;
|
mdb_fill_temp_field(&fields[1],col_type, tmpsiz, 0,0,0,1);
|
||||||
fields[1].siz = tmpsiz;
|
|
||||||
fields[1].is_fixed = 0;
|
|
||||||
fields[1].is_null = 0;
|
|
||||||
fields[1].start = 0;
|
|
||||||
fields[1].colnum = 1;
|
|
||||||
|
|
||||||
sprintf(tmpstr,"%d",col->col_size);
|
sprintf(tmpstr,"%d",col->col_size);
|
||||||
tmpsiz = mdb_ascii2unicode(mdb, tmpstr, 0, 100, col_size);
|
tmpsiz = mdb_ascii2unicode(mdb, tmpstr, 0, 100, col_size);
|
||||||
fields[2].value = col_size;
|
mdb_fill_temp_field(&fields[2],tmpstr, tmpsiz, 0,0,0,2);
|
||||||
fields[2].siz = tmpsiz;
|
|
||||||
fields[2].is_fixed = 0;
|
|
||||||
fields[2].is_null = 0;
|
|
||||||
fields[2].start = 0;
|
|
||||||
fields[2].colnum = 2;
|
|
||||||
|
|
||||||
row_size = mdb_pack_row(ttable, row_buffer, 3, fields);
|
row_size = mdb_pack_row(ttable, row_buffer, 3, fields);
|
||||||
mdb_add_row_to_pg(ttable,row_buffer, row_size);
|
mdb_add_row_to_pg(ttable,row_buffer, row_size);
|
||||||
|
|||||||
Reference in New Issue
Block a user