diff --git a/ChangeLog b/ChangeLog index 4f0439b..6bd5c45 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Thu Sep 23 00:04:05 CDT 2004 Jeff Smith + * src/libmdb/money.c: + * src/libmdb/data.c: + * src/sql/mdbsql.c: + * src/odbc/odbc.c: Correct some field display size problems + Tue Sep 21 22:03:56 CDT 2004 Jeff Smith * HACKING: Numerous corrections and readability improvements * src/odbc/odbc.c: Return SQL_NO_DATA for SQLMoreResults diff --git a/src/libmdb/data.c b/src/libmdb/data.c index d307186..e3379e7 100644 --- a/src/libmdb/data.c +++ b/src/libmdb/data.c @@ -204,8 +204,10 @@ int ret; g_free(str); } else { //fprintf(stdout,"len %d size %d\n",len, col->col_size); - strcpy(col->bind_ptr, - mdb_col_to_string(mdb, mdb->pg_buf, start, col->col_type, len)); + char *str = mdb_col_to_string(mdb, mdb->pg_buf, start, + col->col_type, len); + strcpy(col->bind_ptr, str); + } ret = strlen(col->bind_ptr); if (col->len_ptr) { @@ -786,13 +788,13 @@ int mdb_col_disp_size(MdbColumn *col) return 1; break; case MDB_BYTE: - return 3; + return 4; break; case MDB_INT: - return 5; + return 6; break; case MDB_LONGINT: - return 10; + return 11; break; case MDB_FLOAT: return 10; @@ -810,7 +812,7 @@ int mdb_col_disp_size(MdbColumn *col) return 255; break; case MDB_MONEY: - return 12; + return 21; break; } return 0; diff --git a/src/libmdb/money.c b/src/libmdb/money.c index a4f2c8c..7f2cf65 100644 --- a/src/libmdb/money.c +++ b/src/libmdb/money.c @@ -32,7 +32,7 @@ static int multiply_byte(unsigned char *product, int num, unsigned char *multiplier); static int do_carry(unsigned char *product); -static char *array_to_string(unsigned char *array, int scale, char *s); +static char *array_to_string(unsigned char *array, int unsigned scale, char *s); /** * mdb_money_to_string @@ -44,36 +44,35 @@ static char *array_to_string(unsigned char *array, int scale, char *s); */ char *mdb_money_to_string(MdbHandle *mdb, int start, char *s) { -unsigned char multiplier[MAXPRECISION], temp[MAXPRECISION]; -unsigned char product[MAXPRECISION]; -unsigned char *money; -int num_bytes = 8; -int i; -int pos; -int neg=0; + int num_bytes = 8; + int i; + int neg=0; + unsigned char multiplier[MAXPRECISION], temp[MAXPRECISION]; + unsigned char product[MAXPRECISION]; + unsigned char money[num_bytes]; memset(multiplier,0,MAXPRECISION); memset(product,0,MAXPRECISION); multiplier[0]=1; + memcpy(money, mdb->pg_buf + start, num_bytes); - money = &mdb->pg_buf[start]; - - if (money[7] && 0x01) { - /* negative number -- preform two's complement */ + /* Perform two's complement for negative numbers */ + if (money[7] & 0x80) { neg = 1; for (i=0;i=0 && !multiplier[top];top--); - start=0; - for (i=0;i<=top;i++) { + for (i=0;i9) { product[j+1]+=product[j]/10; product[j]=product[j]%10; } } + if (product[j]>9) { + product[j]=product[j]%10; + } return 0; } -static char *array_to_string(unsigned char *array, int scale, char *s) +static char *array_to_string(unsigned char *array, unsigned int scale, char *s) { -int top, i, j; + unsigned int top, i, j=0; - for (top=MAXPRECISION-1;top>=0 && top>scale && !array[top];top--); + for (top=MAXPRECISION;(top>0) && (top-1>scale) && !array[top-1];top--); - if (top == -1) - { - s[0] = '0'; - s[1] = '\0'; - return s; - } - - j=0; - for (i=top;i>=0;i--) { - if (top+1-j == scale) s[j++]='.'; - s[j++]=array[i]+'0'; + if (top == 0) { + s[j++] = '0'; + } else { + for (i=top; i>0; i--) { + if (j == top-scale) s[j++]='.'; + s[j++]=array[i-1]+'0'; + } } s[j]='\0'; diff --git a/src/odbc/odbc.c b/src/odbc/odbc.c index d46c8fe..a853349 100644 --- a/src/odbc/odbc.c +++ b/src/odbc/odbc.c @@ -32,7 +32,7 @@ #include "connectparams.h" -static char software_version[] = "$Id: odbc.c,v 1.23 2004/09/22 03:08:46 whydoubt Exp $"; +static char software_version[] = "$Id: odbc.c,v 1.24 2004/09/23 05:07:12 whydoubt Exp $"; static void *no_unused_var_warn[] = {software_version, no_unused_var_warn}; @@ -706,24 +706,7 @@ SQLRETURN SQL_API SQLColAttributes( break; //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; - break; - case SQL_SMALLINT: - *pfDesc = 6; - break; - case SQL_TINYINT: - *pfDesc = 4; - break; - default: - //fprintf(stderr,"\nUnknown type %d\n", _odbc_get_client_type(col->col_type)); - break; - } + *pfDesc = mdb_col_disp_size(col); break; } return SQL_SUCCESS; @@ -1183,10 +1166,14 @@ SQLRETURN SQL_API SQLGetData( } } - if (col->cur_value_len) { - strcpy(rgbValue, mdb_col_to_string(mdb,mdb->pg_buf, - col->cur_value_start,col->col_type,col->cur_value_len)); - //*((char *)&rgbValue[col->cur_value_len])='\0'; + if (col->col_type == MDB_BOOL) { + strcpy(rgbValue, (col->cur_value_len)?"0":"1"); + if (pcbValue) + *pcbValue = 1; + } else if (col->cur_value_len) { + char *str = mdb_col_to_string(mdb,mdb->pg_buf, + col->cur_value_start,col->col_type,col->cur_value_len); + strcpy(rgbValue, str); if (pcbValue) *pcbValue = col->cur_value_len; } else { @@ -1675,6 +1662,9 @@ static SQLSMALLINT _odbc_get_client_type(int srv_type) case MDB_LONGINT: return SQL_INTEGER; break; + case MDB_MONEY: + return SQL_DECIMAL; + break; case MDB_FLOAT: return SQL_FLOAT; break; diff --git a/src/sql/mdbsql.c b/src/sql/mdbsql.c index 3634752..4cf7e63 100644 --- a/src/sql/mdbsql.c +++ b/src/sql/mdbsql.c @@ -690,21 +690,11 @@ int found = 0; void mdb_sql_bind_column(MdbSQL *sql, int colnum, char *varaddr) { -MdbTableDef *table = sql->cur_table; -MdbSQLColumn *sqlcol; -MdbColumn *col; -unsigned int j; + MdbSQLColumn *sqlcol; /* sql columns are traditionally 1 based, so decrement colnum */ sqlcol = g_ptr_array_index(sql->columns,colnum - 1); - for (j=0;jnum_cols;j++) { - col=g_ptr_array_index(table->columns,j); - if (!strcasecmp(sqlcol->name, col->name)) { - /* bind the column to its listed (SQL) position */ - mdb_bind_column(table, j+1, varaddr); - break; - } - } + mdb_bind_column_by_name(sql->cur_table, sqlcol->name, varaddr); } void mdb_sql_bind_len(MdbSQL *sql, int colnum, int *len_ptr)