This commit is contained in:
brianb
2004-03-06 23:59:54 +00:00
parent 66f4ea4ae6
commit 9813d08844
8 changed files with 217 additions and 151 deletions

View File

@@ -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:

View File

@@ -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

View File

@@ -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);

View File

@@ -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';

View File

@@ -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)
{ {

View File

@@ -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;

View File

@@ -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,8 +798,7 @@ 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);
@@ -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,11 +918,11 @@ 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 {
} }
@@ -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;

View File

@@ -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);