changeset 1435:2bd1a0774842

upgrade package freetds to cvs
author Mark Brand <mabrand@mabrand.nl>
date Sat, 27 Nov 2010 09:32:48 +0100
parents 5e1db3421f8e
children 3ace1d13163d
files src/freetds-1-fastforward.patch
diffstat 1 files changed, 1059 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/freetds-1-fastforward.patch	Sat Nov 27 00:33:03 2010 +0100
+++ b/src/freetds-1-fastforward.patch	Sat Nov 27 09:32:48 2010 +0100
@@ -25,7 +25,7 @@
 PKGDIR=freetds-0.82
 
 # create or update clone
-#git cvsimport -v -d:pserver:anonymous@freetds.cvs.sourceforge.net:/cvsroot/freetds freetds
+(cd "$GITDIR" && git cvsimport -v -d:pserver:anonymous@freetds.cvs.sourceforge.net:/cvsroot/freetds freetds)
 
 rm -rf $PKGDIR
 tar xf pkg/$PKGDIR.tar.gz
@@ -159171,3 +159171,1061 @@
  
  	/*
  	 * If the server doesen't provide an sqlstate, map one via server native errors
+
+commit fca638660e780e857b5d62f3be175534cdfd4a50
+Author: freddy77 <freddy77>
+Date:   Fri Nov 26 19:05:30 2010 +0000
+
+    add PCHARIN/PCHAROUT macros to declare char parameters
+
+diff --git a/ChangeLog b/ChangeLog
+index 99f1c67..c614823 100644
+--- a/ChangeLog
++++ b/ChangeLog
+@@ -1,3 +1,7 @@
++Fri Nov 26 20:05:17 CET 2010    Frediano Ziglio <freddy77_A_gmail_D_com>
++	* src/odbc/error.c src/odbc/odbc.c src/odbc/sqlwparams.h:
++	- add PCHARIN/PCHAROUT macros to declare char parameters
++
+ Fri Nov 26 09:40:25 CET 2010    Frediano Ziglio <freddy77_A_gmail_D_com>
+ 	* include/tds.h src/server/server.c src/tds/bulk.c src/tds/data.c:
+ 	* src/tds/login.c src/tds/query.c src/tds/token.c:
+@@ -3023,4 +3027,4 @@ Wed Jan  9 19:54:43 EST 2008	JK Lowden <jklowden@freetds.org>
+ 	* ChangeLog-0.82 added because of release
+ 	
+ $FreeTDS$
+-$Id: ChangeLog,v 1.3161 2010/11/26 08:41:26 freddy77 Exp $
++$Id: ChangeLog,v 1.3162 2010/11/26 19:05:30 freddy77 Exp $
+diff --git a/src/odbc/error.c b/src/odbc/error.c
+index 4a2532d..379aa78 100644
+--- a/src/odbc/error.c
++++ b/src/odbc/error.c
+@@ -44,7 +44,7 @@
+ #include <dmalloc.h>
+ #endif
+ 
+-TDS_RCSID(var, "$Id: error.c,v 1.65 2010/07/20 07:56:51 freddy77 Exp $");
++TDS_RCSID(var, "$Id: error.c,v 1.66 2010/11/26 19:05:30 freddy77 Exp $");
+ 
+ static void odbc_errs_pop(struct _sql_errors *errs);
+ static const char *odbc_get_msg(const char *sqlstate);
+@@ -501,7 +501,7 @@ sqlstate2to3(char *state)
+ }
+ 
+ #define FUNC NAME(SQLGetDiagRec) (P(SQLSMALLINT,handleType), P(SQLHANDLE,handle), P(SQLSMALLINT,numRecord), PCHAR(szSqlState),\
+-	P(SQLINTEGER FAR *,pfNativeError), PCHAR(szErrorMsg), P(SQLSMALLINT,cbErrorMsgMax), P(SQLSMALLINT FAR *,pcbErrorMsg) WIDE)
++	P(SQLINTEGER FAR *,pfNativeError), PCHAROUT(ErrorMsg,SQLSMALLINT) WIDE)
+ #include "sqlwparams.h"
+ {
+ 	SQLRETURN result;
+@@ -575,7 +575,7 @@ sqlstate2to3(char *state)
+ }
+ 
+ #define FUNC NAME(SQLError) (P(SQLHENV,henv), P(SQLHDBC,hdbc), P(SQLHSTMT,hstmt), PCHAR(szSqlState), P(SQLINTEGER FAR *,pfNativeError),\
+-	PCHAR(szErrorMsg), P(SQLSMALLINT,cbErrorMsgMax), P(SQLSMALLINT FAR *,pcbErrorMsg) WIDE)
++	PCHAROUT(ErrorMsg,SQLSMALLINT) WIDE)
+ #include "sqlwparams.h"
+ {
+ 	SQLRETURN result;
+diff --git a/src/odbc/odbc.c b/src/odbc/odbc.c
+index 75920ed..58fbee4 100644
+--- a/src/odbc/odbc.c
++++ b/src/odbc/odbc.c
+@@ -61,7 +61,7 @@
+ #include <dmalloc.h>
+ #endif
+ 
+-TDS_RCSID(var, "$Id: odbc.c,v 1.553 2010/11/25 19:31:49 freddy77 Exp $");
++TDS_RCSID(var, "$Id: odbc.c,v 1.554 2010/11/26 19:05:30 freddy77 Exp $");
+ 
+ static SQLRETURN _SQLAllocConnect(SQLHENV henv, SQLHDBC FAR * phdbc);
+ static SQLRETURN _SQLAllocEnv(SQLHENV FAR * phenv, SQLINTEGER odbc_version);
+@@ -515,9 +515,8 @@ odbc_prepare(TDS_STMT *stmt)
+ 	ODBC_RETURN_(stmt);
+ }
+ 
+-#define FUNC NAME(SQLDriverConnect) (P(SQLHDBC,hdbc), P(SQLHWND,hwnd), PCHAR(szConnStrIn), P(SQLSMALLINT,cbConnStrIn), \
+-	PCHAR(szConnStrOut), P(SQLSMALLINT,cbConnStrOutMax), P(SQLSMALLINT FAR *,pcbConnStrOut), \
+-	P(SQLUSMALLINT,fDriverCompletion) WIDE)
++#define FUNC NAME(SQLDriverConnect) (P(SQLHDBC,hdbc), P(SQLHWND,hwnd), PCHARIN(ConnStrIn,SQLSMALLINT), \
++	PCHAROUT(ConnStrOut,SQLSMALLINT), P(SQLUSMALLINT,fDriverCompletion) WIDE)
+ #include "sqlwparams.h"
+ {
+ 	TDSCONNECTION *connection;
+@@ -641,8 +640,8 @@ SQLBrowseConnect(SQLHDBC hdbc, SQLCHAR FAR * szConnStrIn, SQLSMALLINT cbConnStrI
+ #endif
+ 
+ 
+-#define FUNC NAME(SQLColumnPrivileges) (P(SQLHSTMT,hstmt), PCHAR(szCatalogName), P(SQLSMALLINT,cbCatalogName), PCHAR(szSchemaName), \
+-	P(SQLSMALLINT,cbSchemaName), PCHAR(szTableName), P(SQLSMALLINT,cbTableName), PCHAR(szColumnName), P(SQLSMALLINT,cbColumnName) WIDE)
++#define FUNC NAME(SQLColumnPrivileges) (P(SQLHSTMT,hstmt), PCHARIN(CatalogName,SQLSMALLINT), PCHARIN(SchemaName,SQLSMALLINT), \
++	PCHARIN(TableName,SQLSMALLINT), PCHARIN(ColumnName,SQLSMALLINT) WIDE)
+ #include "sqlwparams.h"
+ {
+ 	int retcode;
+@@ -733,10 +732,10 @@ SQLExtendedFetch(SQLHSTMT hstmt, SQLUSMALLINT fFetchType, SQLROWOFFSET irow, SQL
+ 	ODBC_RETURN(stmt, ret);
+ }
+ 
+-#define FUNC NAME(SQLForeignKeys) (P(SQLHSTMT,hstmt), PCHAR(szPkCatalogName), P(SQLSMALLINT,cbPkCatalogName), PCHAR(szPkSchemaName),\
+-	P(SQLSMALLINT,cbPkSchemaName), PCHAR(szPkTableName), P(SQLSMALLINT,cbPkTableName), PCHAR(szFkCatalogName),\
+-	P(SQLSMALLINT,cbFkCatalogName), PCHAR(szFkSchemaName), P(SQLSMALLINT,cbFkSchemaName), PCHAR(szFkTableName),\
+-	P(SQLSMALLINT,cbFkTableName) WIDE)
++#define FUNC NAME(SQLForeignKeys) (P(SQLHSTMT,hstmt), PCHARIN(PkCatalogName,SQLSMALLINT),\
++	PCHARIN(PkSchemaName,SQLSMALLINT), PCHARIN(PkTableName,SQLSMALLINT),\
++	PCHARIN(FkCatalogName,SQLSMALLINT), PCHARIN(FkSchemaName,SQLSMALLINT),\
++	PCHARIN(FkTableName,SQLSMALLINT) WIDE)
+ #include "sqlwparams.h"
+ {
+ 	int retcode;
+@@ -960,8 +959,8 @@ SQLMoreResults(SQLHSTMT hstmt)
+ 	ODBC_RETURN(stmt, SQL_ERROR);
+ }
+ 
+-#define FUNC NAME(SQLNativeSql) (P(SQLHDBC,hdbc), PCHAR(szSqlStrIn), P(SQLINTEGER,cbSqlStrIn), PCHAR(szSqlStr), \
+-	P(SQLINTEGER,cbSqlStrMax), P(SQLINTEGER FAR *,pcbSqlStr) WIDE)
++#define FUNC NAME(SQLNativeSql) (P(SQLHDBC,hdbc), PCHARIN(SqlStrIn,SQLINTEGER),\
++	PCHAROUT(SqlStr,SQLINTEGER) WIDE)
+ #include "sqlwparams.h"
+ {
+ 	SQLRETURN ret = SQL_SUCCESS;
+@@ -1019,8 +1018,8 @@ SQLParamOptions(SQLHSTMT hstmt, SQLULEN crow, SQLULEN FAR * pirow)
+ 	return _SQLSetStmtAttr(hstmt, SQL_ATTR_PARAMSET_SIZE, (SQLPOINTER) (TDS_INTPTR) crow, 0);
+ }
+ 
+-#define FUNC NAME(SQLPrimaryKeys) (P(SQLHSTMT,hstmt), PCHAR(szCatalogName), P(SQLSMALLINT,cbCatalogName), PCHAR(szSchemaName),\
+-	P(SQLSMALLINT,cbSchemaName), PCHAR(szTableName), P(SQLSMALLINT,cbTableName) WIDE)
++#define FUNC NAME(SQLPrimaryKeys) (P(SQLHSTMT,hstmt), PCHARIN(CatalogName,SQLSMALLINT),\
++	PCHARIN(SchemaName,SQLSMALLINT), PCHARIN(TableName,SQLSMALLINT) WIDE)
+ #include "sqlwparams.h"
+ {
+ 	int retcode;
+@@ -1040,9 +1039,8 @@ SQLParamOptions(SQLHSTMT hstmt, SQLULEN crow, SQLULEN FAR * pirow)
+ 	ODBC_RETURN_(stmt);
+ }
+ 
+-#define FUNC NAME(SQLProcedureColumns) (P(SQLHSTMT,hstmt), PCHAR(szCatalogName), P(SQLSMALLINT,cbCatalogName), PCHAR(szSchemaName),\
+-	P(SQLSMALLINT,cbSchemaName), PCHAR(szProcName), P(SQLSMALLINT,cbProcName), PCHAR(szColumnName),\
+-	P(SQLSMALLINT,cbColumnName) WIDE)
++#define FUNC NAME(SQLProcedureColumns) (P(SQLHSTMT,hstmt), PCHARIN(CatalogName,SQLSMALLINT),\
++	PCHARIN(SchemaName,SQLSMALLINT), PCHARIN(ProcName,SQLSMALLINT), PCHARIN(ColumnName,SQLSMALLINT) WIDE)
+ #include "sqlwparams.h"
+ {
+ 	int retcode;
+@@ -1070,8 +1068,8 @@ SQLParamOptions(SQLHSTMT hstmt, SQLULEN crow, SQLULEN FAR * pirow)
+ 	ODBC_RETURN_(stmt);
+ }
+ 
+-#define FUNC NAME(SQLProcedures) (P(SQLHSTMT,hstmt), PCHAR(szCatalogName), P(SQLSMALLINT,cbCatalogName), PCHAR(szSchemaName),\
+-	P(SQLSMALLINT,cbSchemaName), PCHAR(szProcName), P(SQLSMALLINT,cbProcName) WIDE)
++#define FUNC NAME(SQLProcedures) (P(SQLHSTMT,hstmt), PCHARIN(CatalogName,SQLSMALLINT),\
++	PCHARIN(SchemaName,SQLSMALLINT), PCHARIN(ProcName,SQLSMALLINT) WIDE)
+ #include "sqlwparams.h"
+ {
+ 	int retcode;
+@@ -1211,8 +1209,8 @@ SQLSetPos(SQLHSTMT hstmt, SQLSETPOSIROW irow, SQLUSMALLINT fOption, SQLUSMALLINT
+ 	ODBC_RETURN_(stmt);
+ }
+ 
+-#define FUNC NAME(SQLTablePrivileges) (P(SQLHSTMT,hstmt), PCHAR(szCatalogName), P(SQLSMALLINT,cbCatalogName), PCHAR(szSchemaName),\
+-	P(SQLSMALLINT,cbSchemaName), PCHAR(szTableName), P(SQLSMALLINT,cbTableName) WIDE)
++#define FUNC NAME(SQLTablePrivileges) (P(SQLHSTMT,hstmt), PCHARIN(CatalogName,SQLSMALLINT),\
++	PCHARIN(SchemaName,SQLSMALLINT), PCHARIN(TableName,SQLSMALLINT) WIDE)
+ #include "sqlwparams.h"
+ {
+ 	int retcode;
+@@ -1827,8 +1825,8 @@ SQLCancel(SQLHSTMT hstmt)
+ 	ODBC_RETURN_(stmt);
+ }
+ 
+-#define FUNC NAME(SQLConnect) (P(SQLHDBC,hdbc), PCHAR(szDSN), P(SQLSMALLINT,cbDSN), PCHAR(szUID), P(SQLSMALLINT,cbUID), \
+-	PCHAR(szAuthStr), P(SQLSMALLINT,cbAuthStr) WIDE)
++#define FUNC NAME(SQLConnect) (P(SQLHDBC,hdbc), PCHARIN(DSN,SQLSMALLINT), PCHARIN(UID,SQLSMALLINT), \
++	PCHARIN(AuthStr,SQLSMALLINT) WIDE)
+ #include "sqlwparams.h"
+ {
+ 	SQLRETURN result;
+@@ -1909,8 +1907,8 @@ SQLCancel(SQLHSTMT hstmt)
+ 	ODBC_RETURN_(dbc);
+ }
+ 
+-#define FUNC NAME(SQLDescribeCol) (P(SQLHSTMT,hstmt), P(SQLUSMALLINT,icol), PCHAR(szColName), P(SQLSMALLINT,cbColNameMax), \
+-	P(SQLSMALLINT FAR *,pcbColName), P(SQLSMALLINT FAR *,pfSqlType), P(SQLULEN FAR *,pcbColDef), \
++#define FUNC NAME(SQLDescribeCol) (P(SQLHSTMT,hstmt), P(SQLUSMALLINT,icol), PCHAROUT(ColName,SQLSMALLINT),\
++	P(SQLSMALLINT FAR *,pfSqlType), P(SQLULEN FAR *,pcbColDef), \
+ 	P(SQLSMALLINT FAR *,pibScale), P(SQLSMALLINT FAR *,pfNullable) WIDE)
+ #include "sqlwparams.h"
+ {
+@@ -2410,8 +2408,8 @@ SQLSetDescRec(SQLHDESC hdesc, SQLSMALLINT nRecordNumber, SQLSMALLINT nType, SQLS
+ 	ODBC_RETURN_(desc);
+ }
+ 
+-#define FUNC NAME(SQLGetDescRec) (P(SQLHDESC,hdesc), P(SQLSMALLINT,RecordNumber), PCHAR(Name), P(SQLSMALLINT,BufferLength), \
+-	P(SQLSMALLINT *,StringLength), P(SQLSMALLINT *,Type), P(SQLSMALLINT *,SubType), P(SQLLEN FAR *,Length), \
++#define FUNC NAME(SQLGetDescRec) (P(SQLHDESC,hdesc), P(SQLSMALLINT,RecordNumber), PCHAROUT(Name,SQLSMALLINT), \
++	P(SQLSMALLINT *,Type), P(SQLSMALLINT *,SubType), P(SQLLEN FAR *,Length), \
+ 	P(SQLSMALLINT *,Precision), P(SQLSMALLINT *,Scale), P(SQLSMALLINT *,Nullable) WIDE)
+ #include "sqlwparams.h"
+ {
+@@ -2421,7 +2419,7 @@ SQLSetDescRec(SQLHDESC hdesc, SQLSMALLINT nRecordNumber, SQLSMALLINT nType, SQLS
+ 	INIT_HDESC;
+ 
+ 	tdsdump_log(TDS_DBG_FUNC, "SQLGetDescRec(%p, %d, %p, %d, %p, %p, %p, %p, %p, %p, %p)\n", 
+-			hdesc, RecordNumber, Name, BufferLength, StringLength, Type, SubType, Length, Precision, Scale, Nullable);
++			hdesc, RecordNumber, szName, cbNameMax, pcbName, Type, SubType, Length, Precision, Scale, Nullable);
+ 
+ 	if (RecordNumber <= 0) {
+ 		odbc_errs_add(&desc->errs, "07009", NULL);
+@@ -2439,7 +2437,7 @@ SQLSetDescRec(SQLHDESC hdesc, SQLSMALLINT nRecordNumber, SQLSMALLINT nType, SQLS
+ 
+ 	drec = &desc->records[RecordNumber - 1];
+ 
+-	if ((rc = odbc_set_string(desc_get_dbc(desc), Name, BufferLength, StringLength, tds_dstr_cstr(&drec->sql_desc_name), -1)) != SQL_SUCCESS)
++	if ((rc = odbc_set_string(desc_get_dbc(desc), szName, cbNameMax, pcbName, tds_dstr_cstr(&drec->sql_desc_name), -1)) != SQL_SUCCESS)
+ 		odbc_errs_add(&desc->errs, "01004", NULL);
+ 
+ 	if (Type)
+@@ -3456,7 +3454,7 @@ _SQLExecute(TDS_STMT * stmt)
+ 	ODBC_RETURN_(stmt);
+ }
+ 
+-#define FUNC NAME(SQLExecDirect) (P(SQLHSTMT,hstmt), PCHAR(szSqlStr), P(SQLINTEGER,cbSqlStr) WIDE)
++#define FUNC NAME(SQLExecDirect) (P(SQLHSTMT,hstmt), PCHARIN(SqlStr,SQLINTEGER) WIDE)
+ #include "sqlwparams.h"
+ {
+ 	SQLRETURN res;
+@@ -4438,7 +4436,7 @@ SQLNumResultCols(SQLHSTMT hstmt, SQLSMALLINT FAR * pccol)
+ 	ODBC_RETURN_(stmt);
+ }
+ 
+-#define FUNC NAME(SQLPrepare) (P(SQLHSTMT,hstmt), PCHAR(szSqlStr), P(SQLINTEGER,cbSqlStr) WIDE)
++#define FUNC NAME(SQLPrepare) (P(SQLHSTMT,hstmt), PCHARIN(SqlStr,SQLINTEGER) WIDE)
+ #include "sqlwparams.h"
+ {
+ 	SQLRETURN retcode;
+@@ -4529,7 +4527,7 @@ SQLRowCount(SQLHSTMT hstmt, SQLLEN FAR * pcrow)
+ 	return rc;
+ }
+ 
+-#define FUNC NAME(SQLSetCursorName) (P(SQLHSTMT,hstmt), PCHAR(szCursor), P(SQLSMALLINT,cbCursor) WIDE)
++#define FUNC NAME(SQLSetCursorName) (P(SQLHSTMT,hstmt), PCHARIN(Cursor,SQLSMALLINT) WIDE)
+ #include "sqlwparams.h"
+ {
+ 	INIT_HSTMT;
+@@ -4550,7 +4548,7 @@ SQLRowCount(SQLHSTMT hstmt, SQLLEN FAR * pcrow)
+ 	ODBC_RETURN_(stmt);
+ }
+ 
+-#define FUNC NAME(SQLGetCursorName) (P(SQLHSTMT,hstmt), PCHAR(szCursor), P(SQLSMALLINT,cbCursorMax), P(SQLSMALLINT FAR *,pcbCursor) WIDE)
++#define FUNC NAME(SQLGetCursorName) (P(SQLHSTMT,hstmt), PCHAROUT(Cursor,SQLSMALLINT) WIDE)
+ #include "sqlwparams.h"
+ {
+ 	SQLRETURN rc;
+@@ -4677,11 +4675,11 @@ SQLSetParam(SQLHSTMT hstmt, SQLUSMALLINT ipar, SQLSMALLINT fCType, SQLSMALLINT f
+  *                 [ , [ @ODBCVer = ] ODBCVer ] 
+  *
+  */
+-#define FUNC NAME(SQLColumns) (P(SQLHSTMT,hstmt), PCHAR(szCatalogName),	/* object_qualifier */ \
+-	P(SQLSMALLINT,cbCatalogName), PCHAR(szSchemaName),	/* object_owner */ \
+-	P(SQLSMALLINT,cbSchemaName), PCHAR(szTableName),	/* object_name */ \
+-	P(SQLSMALLINT,cbTableName), PCHAR(szColumnName),	/* column_name */ \
+-	P(SQLSMALLINT,cbColumnName) WIDE)
++#define FUNC NAME(SQLColumns) (P(SQLHSTMT,hstmt), PCHARIN(CatalogName,SQLSMALLINT),	/* object_qualifier */ \
++	PCHARIN(SchemaName,SQLSMALLINT),	/* object_owner */ \
++	PCHARIN(TableName,SQLSMALLINT),	/* object_name */ \
++	PCHARIN(ColumnName,SQLSMALLINT)	/* column_name */ \
++	WIDE)
+ #include "sqlwparams.h"
+ {
+ 	int retcode;
+@@ -6533,8 +6531,8 @@ SQLSetStmtOption(SQLHSTMT hstmt, SQLUSMALLINT fOption, SQLULEN vParam)
+ 	return _SQLSetStmtAttr(hstmt, (SQLINTEGER) fOption, (SQLPOINTER) vParam, SQL_NTS);
+ }
+ 
+-#define FUNC NAME(SQLSpecialColumns) (P(SQLHSTMT,hstmt), P(SQLUSMALLINT,fColType), PCHAR(szCatalogName), P(SQLSMALLINT,cbCatalogName), \
+-	PCHAR(szSchemaName), P(SQLSMALLINT,cbSchemaName), PCHAR(szTableName), P(SQLSMALLINT,cbTableName), \
++#define FUNC NAME(SQLSpecialColumns) (P(SQLHSTMT,hstmt), P(SQLUSMALLINT,fColType), PCHARIN(CatalogName,SQLSMALLINT), \
++	PCHARIN(SchemaName,SQLSMALLINT), PCHARIN(TableName,SQLSMALLINT), \
+ 	P(SQLUSMALLINT,fScope), P(SQLUSMALLINT,fNullable) WIDE)
+ #include "sqlwparams.h"
+ {
+@@ -6611,8 +6609,8 @@ SQLSetStmtOption(SQLHSTMT hstmt, SQLUSMALLINT fOption, SQLULEN vParam)
+ 	ODBC_RETURN_(stmt);
+ }
+ 
+-#define FUNC NAME(SQLStatistics) (P(SQLHSTMT,hstmt), PCHAR(szCatalogName), P(SQLSMALLINT,cbCatalogName), PCHAR(szSchemaName), \
+-	P(SQLSMALLINT,cbSchemaName), PCHAR(szTableName), P(SQLSMALLINT,cbTableName), P(SQLUSMALLINT,fUnique), \
++#define FUNC NAME(SQLStatistics) (P(SQLHSTMT,hstmt), PCHARIN(CatalogName,SQLSMALLINT),\
++	PCHARIN(SchemaName,SQLSMALLINT), PCHARIN(TableName,SQLSMALLINT), P(SQLUSMALLINT,fUnique), \
+ 	P(SQLUSMALLINT,fAccuracy) WIDE)
+ #include "sqlwparams.h"
+ {
+@@ -6672,9 +6670,8 @@ SQLSetStmtOption(SQLHSTMT hstmt, SQLUSMALLINT fOption, SQLULEN vParam)
+ 	ODBC_RETURN_(stmt);
+ }
+ 
+-#define FUNC NAME(SQLTables) (P(SQLHSTMT,hstmt), PCHAR(szCatalogName), P(SQLSMALLINT,cbCatalogName), PCHAR(szSchemaName), \
+-	P(SQLSMALLINT,cbSchemaName), PCHAR(szTableName), P(SQLSMALLINT,cbTableName), PCHAR(szTableType), \
+-	P(SQLSMALLINT,cbTableType) WIDE)
++#define FUNC NAME(SQLTables) (P(SQLHSTMT,hstmt), PCHARIN(CatalogName,SQLSMALLINT), \
++	PCHARIN(SchemaName,SQLSMALLINT), PCHARIN(TableName,SQLSMALLINT), PCHARIN(TableType,SQLSMALLINT) WIDE)
+ #include "sqlwparams.h"
+ {
+ 	int retcode;
+diff --git a/src/odbc/sqlwparams.h b/src/odbc/sqlwparams.h
+index 3c8253c..faa98da 100644
+--- a/src/odbc/sqlwparams.h
++++ b/src/odbc/sqlwparams.h
+@@ -6,10 +6,14 @@
+ #undef WIDE
+ #undef P
+ #undef PCHAR
++#undef PCHARIN
++#undef PCHAROUT
+ #define NAME(a) _ ## a
+ #define WIDE , int wide
+ #define P(a,b) a b
+ #define PCHAR(a) ODBC_CHAR* a
++#define PCHARIN(n,t) PCHAR(sz ## n), P(t, cb ## n)
++#define PCHAROUT(n,t) PCHAR(sz ## n), P(t, cb ## n ## Max), P(t FAR*, pcb ## n)
+ static SQLRETURN FUNC;
+ 
+ 
+@@ -76,10 +80,14 @@ static SQLRETURN FUNC
+ #undef WIDE
+ #undef P
+ #undef PCHAR
++#undef PCHARIN
++#undef PCHAROUT
+ #define NAME(a) _ ## a
+ #define WIDE
+ #define P(a,b) a b
+ #define PCHAR(a) SQLCHAR* a
++#define PCHARIN(n,t) PCHAR(sz ## n), P(t, cb ## n)
++#define PCHAROUT(n,t) PCHAR(sz ## n), P(t, cb ## n ## Max), P(t FAR*, pcb ## n)
+ static SQLRETURN FUNC;
+ 
+ 
+
+commit 9f8217fed18fc290ba9411799f183f21eb93497b
+Author: freddy77 <freddy77>
+Date:   Fri Nov 26 19:17:35 2010 +0000
+
+    improve random in challenge code
+
+diff --git a/ChangeLog b/ChangeLog
+index c614823..e094fd7 100644
+--- a/ChangeLog
++++ b/ChangeLog
+@@ -1,3 +1,6 @@
++Fri Nov 26 20:17:27 CET 2010    Frediano Ziglio <freddy77_A_gmail_D_com>
++	* src/tds/challenge.c: improve random in challenge code
++
+ Fri Nov 26 20:05:17 CET 2010    Frediano Ziglio <freddy77_A_gmail_D_com>
+ 	* src/odbc/error.c src/odbc/odbc.c src/odbc/sqlwparams.h:
+ 	- add PCHARIN/PCHAROUT macros to declare char parameters
+@@ -3027,4 +3030,4 @@ Wed Jan  9 19:54:43 EST 2008	JK Lowden <jklowden@freetds.org>
+ 	* ChangeLog-0.82 added because of release
+ 	
+ $FreeTDS$
+-$Id: ChangeLog,v 1.3162 2010/11/26 19:05:30 freddy77 Exp $
++$Id: ChangeLog,v 1.3163 2010/11/26 19:17:35 freddy77 Exp $
+diff --git a/src/tds/challenge.c b/src/tds/challenge.c
+index 0951f13..d8b44cf 100644
+--- a/src/tds/challenge.c
++++ b/src/tds/challenge.c
+@@ -45,11 +45,15 @@
+ #include "des.h"
+ #include "tdsiconv.h"
+ 
++#if defined(HAVE_OPENSSL)
++#include <openssl/ssl.h>
++#endif
++
+ #ifdef DMALLOC
+ #include <dmalloc.h>
+ #endif
+ 
+-TDS_RCSID(var, "$Id: challenge.c,v 1.46 2010/11/16 13:25:15 freddy77 Exp $");
++TDS_RCSID(var, "$Id: challenge.c,v 1.47 2010/11/26 19:17:35 freddy77 Exp $");
+ 
+ /**
+  * \ingroup libtds
+@@ -144,6 +148,13 @@ generate_random_buffer(unsigned char *out, int len)
+ {
+ 	int i;
+ 
++#if defined(HAVE_OPENSSL)
++	if (RAND_bytes(out, len) == 1)
++		return;
++	if (RAND_pseudo_bytes(out, len) >= 0)
++		return;
++#endif
++
+ 	/* TODO find a better random... */
+ 	for (i = 0; i < len; ++i)
+ 		out[i] = rand() / (RAND_MAX / 256);
+
+commit 4bac616110bdbf625a6378bdfaa161735f7cf9c9
+Author: freddy77 <freddy77>
+Date:   Fri Nov 26 19:46:55 2010 +0000
+
+    use numeric constant for canonic charsets
+
+diff --git a/ChangeLog b/ChangeLog
+index e094fd7..89f4d38 100644
+--- a/ChangeLog
++++ b/ChangeLog
+@@ -1,3 +1,7 @@
++Fri Nov 26 20:46:45 CET 2010    Frediano Ziglio <freddy77_A_gmail_D_com>
++	* include/tds.h src/tds/encodings.pl src/tds/iconv.c:
++	- use numeric constant for canonic charsets
++
+ Fri Nov 26 20:17:27 CET 2010    Frediano Ziglio <freddy77_A_gmail_D_com>
+ 	* src/tds/challenge.c: improve random in challenge code
+ 
+@@ -3030,4 +3034,4 @@ Wed Jan  9 19:54:43 EST 2008	JK Lowden <jklowden@freetds.org>
+ 	* ChangeLog-0.82 added because of release
+ 	
+ $FreeTDS$
+-$Id: ChangeLog,v 1.3163 2010/11/26 19:17:35 freddy77 Exp $
++$Id: ChangeLog,v 1.3164 2010/11/26 19:46:55 freddy77 Exp $
+diff --git a/include/tds.h b/include/tds.h
+index 64d9f82..2460f88 100644
+--- a/include/tds.h
++++ b/include/tds.h
+@@ -21,7 +21,7 @@
+ #ifndef _tds_h_
+ #define _tds_h_
+ 
+-/* $Id: tds.h,v 1.345 2010/11/26 08:41:26 freddy77 Exp $ */
++/* $Id: tds.h,v 1.346 2010/11/26 19:46:55 freddy77 Exp $ */
+ 
+ #include <stdarg.h>
+ #include <stdio.h>
+@@ -945,6 +945,7 @@ typedef struct tds_encoding
+ 	const char *name;
+ 	unsigned char min_bytes_per_char;
+ 	unsigned char max_bytes_per_char;
++	unsigned char canonic;
+ } TDS_ENCODING;
+ 
+ typedef struct tds_bcpcoldata
+diff --git a/src/tds/encodings.pl b/src/tds/encodings.pl
+index 719482e..57bb43e 100755
+--- a/src/tds/encodings.pl
++++ b/src/tds/encodings.pl
+@@ -30,7 +30,7 @@ $filename = "${srcdir}sybase_character_sets.h";
+ open(OUT, ">$filename") or die qq($basename: could not open "$filename"\n);
+ print OUT "/*\n";
+ print OUT " * This file produced from $0\n";
+-print OUT ' * $Id: encodings.pl,v 1.11 2008/03/11 08:36:41 freddy77 Exp $', "\n";
++print OUT ' * $Id: encodings.pl,v 1.12 2010/11/26 19:46:55 freddy77 Exp $', "\n";
+ print OUT " */\n";
+ 
+ # look up the canonical name
+@@ -77,7 +77,7 @@ close(OUT);
+ print "/*\n";
+ $date = localtime;
+ print " * This file produced from $0 on $date\n";
+-print ' * $Id: encodings.pl,v 1.11 2008/03/11 08:36:41 freddy77 Exp $', "\n";
++print ' * $Id: encodings.pl,v 1.12 2010/11/26 19:46:55 freddy77 Exp $', "\n";
+ print " */\n";
+ 
+ %charsets = ();
+@@ -128,33 +128,26 @@ $index{"UCS-2LE"} = $i++;
+ $index{"UCS-2BE"} = $i++;
+ foreach $n (sort grep(!/^(ISO-8859-1|UTF-8|UCS-2LE|UCS-2BE)$/,keys %charsets))
+ {
+-	$index{$n} = $i;
+-	$i++ if $n;
++	next if exists($index{$n}) || !$n;
++	$index{$n} = $i++;
+ }
+ 
++print "#ifdef TDS_ICONV_ENCODING_TABLES\n\n";
++
+ # output all charset
+ print "static const TDS_ENCODING canonic_charsets[] = {\n";
+ $i=0;
+ foreach $n (sort { $index{$a} <=> $index{$b} } keys %charsets)
+ {
+ 	my ($a, $b) = @{$charsets{$n}};
+-	my $index = ($n)? (sprintf "/* %3d */", $i) : "\t";
+-	printf "\t{%20s,\t$a, $b},\t%s\n", qq/"$n"/, $index;
+-	$i++ if $n;
++	next if !$n;
++	printf "\t{%20s,\t$a, $b, %3d},\t/* %3d */\n", qq/"$n"/, $i, $i;
++	++$i;
+ }
+-print "\t{\"\",\t0, 0}\n";
++die('too much encodings') if $i >= 256;
++print "\t{\"\",\t0, 0, 0}\n";
+ print "};\n\n";
+ 
+-# output enumerated charset indexes
+-print "enum {\n";
+-$i=0;
+-foreach $n (sort { $index{$a} <=> $index{$b} } keys %charsets)
+-{
+-	$n =~ tr/-a-z/_A-Z/;
+-	printf "\t%30s =%4d,\n", "TDS_CHARSET_$n", $i++;
+-}
+-printf "\t%30s =%4d\n};\n\n", "TDS_NUM_CHARSETS", $i++;
+-
+ # output all alias
+ print "static const CHARACTER_SET_ALIAS iconv_aliases[] = {\n";
+ foreach $n (sort keys %alternates)
+@@ -175,7 +168,19 @@ foreach $n (sort keys %sybase)
+ 	printf "\t{%20s, %3d },\n", qq/"$n"/, $a;
+ }
+ print "\t{NULL,\t0}\n";
+-print "};\n\n";
++print "};\n";
++
++print "#endif\n\n";
++
++# output enumerated charset indexes
++print "enum {\n";
++$i=0;
++foreach $n (sort { $index{$a} <=> $index{$b} } keys %charsets)
++{
++	$n =~ tr/-a-z/_A-Z/;
++	printf "\t%30s =%4d,\n", "TDS_CHARSET_$n", $i++;
++}
++printf "\t%30s =%4d\n};\n\n", "TDS_NUM_CHARSETS", $i++;
+ 
+ exit 0;
+ __DATA__
+diff --git a/src/tds/iconv.c b/src/tds/iconv.c
+index 1dd40c7..98d1479 100644
+--- a/src/tds/iconv.c
++++ b/src/tds/iconv.c
+@@ -18,11 +18,6 @@
+  * Boston, MA 02111-1307, USA.
+  */
+ 
+-/*
+- * iconv.c, handle all the conversion stuff without spreading #if HAVE_ICONV_ALWAYS 
+- * all over the other code
+- */
+-
+ #if HAVE_CONFIG_H
+ #include <config.h>
+ #endif
+@@ -47,21 +42,15 @@
+ #include <dmalloc.h>
+ #endif
+ 
+-/* define this for now; remove when done testing */
+-#define HAVE_ICONV_ALWAYS 1
+-
+-TDS_RCSID(var, "$Id: iconv.c,v 1.146 2010/11/21 21:24:09 freddy77 Exp $");
++TDS_RCSID(var, "$Id: iconv.c,v 1.147 2010/11/26 19:46:55 freddy77 Exp $");
+ 
+ #define CHARSIZE(charset) ( ((charset)->min_bytes_per_char == (charset)->max_bytes_per_char )? \
+ 				(charset)->min_bytes_per_char : 0 )
+ 
+ 
+-#if !HAVE_ICONV_ALWAYS
+-static int bytes_per_char(TDS_ENCODING * charset);
+-#endif
+-static const char *collate2charset(int sql_collate, int lcid);
++static int collate2charset(int sql_collate, int lcid);
+ static size_t skip_one_input_sequence(iconv_t cd, const TDS_ENCODING * charset, const char **input, size_t * input_size);
+-static int tds_iconv_info_init(TDSICONV * char_conv, const char *client_name, const char *server_name);
++static int tds_iconv_info_init(TDSICONV * char_conv, int client_canonic, int server_canonic);
+ static int tds_iconv_init(void);
+ static int tds_canonical_charset(const char *charset_name);
+ static void _iconv_close(iconv_t * cd);
+@@ -74,7 +63,7 @@ static void tds_iconv_info_close(TDSICONV * char_conv);
+  * Convert between different charsets.
+  */
+ 
+-
++#define TDS_ICONV_ENCODING_TABLES
+ #include "encodings.h"
+ 
+ /* this will contain real iconv names */
+@@ -265,6 +254,7 @@ tds_iconv_reset(TDSICONV *conv)
+ 	conv->client_charset.max_bytes_per_char = 1;
+ 
+ 	conv->server_charset.name = conv->client_charset.name = "";
++	conv->server_charset.canonic = conv->client_charset.canonic = 0;
+ 	conv->to_wire = (iconv_t) -1;
+ 	conv->to_wire2 = (iconv_t) -1;
+ 	conv->from_wire = (iconv_t) -1;
+@@ -329,7 +319,9 @@ void
+ tds_iconv_open(TDSSOCKET * tds, const char *charset)
+ {
+ 	static const char UCS_2LE[] = "UCS-2LE";
+-	const char *name;
++	int canonic;
++	int canonic_charset = tds_canonical_charset(charset);
++	int canonic_env_charset = tds->env.charset ? tds_canonical_charset(tds->env.charset) : -1;
+ 	int fOK, ret;
+ 
+ 	TDS_ENCODING *client = &tds->char_convs[client2ucs2]->client_charset;
+@@ -337,15 +329,6 @@ tds_iconv_open(TDSSOCKET * tds, const char *charset)
+ 
+ 	tdsdump_log(TDS_DBG_FUNC, "tds_iconv_open(%p, %s)\n", tds, charset);
+ 
+-#if !HAVE_ICONV_ALWAYS
+-
+-	strcpy(client->name, "ISO-8859-1");
+-	strcpy(server->name, UCS_2LE);
+-
+-	bytes_per_char(client);
+-	bytes_per_char(server);
+-	return;
+-#else
+ 	/* initialize */
+ 	if (!iconv_initialized) {
+ 		if ((ret = tds_iconv_init()) > 0) {
+@@ -367,7 +350,7 @@ tds_iconv_open(TDSSOCKET * tds, const char *charset)
+ 
+ 	tdsdump_log(TDS_DBG_FUNC, "preparing iconv for \"%s\" <-> \"%s\" conversion\n", charset, UCS_2LE);
+ 
+-	fOK = tds_iconv_info_init(tds->char_convs[client2ucs2], charset, UCS_2LE);
++	fOK = tds_iconv_info_init(tds->char_convs[client2ucs2], canonic_charset, TDS_CHARSET_UCS_2LE);
+ 	if (!fOK)
+ 		return;
+ 
+@@ -386,13 +369,12 @@ tds_iconv_open(TDSSOCKET * tds, const char *charset)
+ 	 *       not sure what to do about that yet.  
+ 	 */
+ 	tds->char_convs[client2server_chardata]->flags = TDS_ENCODING_MEMCPY;
+-	if (tds->env.charset) {
++	if (canonic_env_charset >= 0) {
+ 		tdsdump_log(TDS_DBG_FUNC, "preparing iconv for \"%s\" <-> \"%s\" conversion\n", charset, tds->env.charset);
+-		fOK = tds_iconv_info_init(tds->char_convs[client2server_chardata], charset, tds->env.charset);
++		fOK = tds_iconv_info_init(tds->char_convs[client2server_chardata], canonic_charset, canonic_env_charset);
+ 		if (!fOK)
+ 			return;
+ 	} else {
+-		int canonic_charset = tds_canonical_charset(charset);
+ 		tds->char_convs[client2server_chardata]->client_charset = canonic_charsets[canonic_charset];
+ 		tds->char_convs[client2server_chardata]->server_charset = canonic_charsets[canonic_charset];
+ 	}
+@@ -400,17 +382,16 @@ tds_iconv_open(TDSSOCKET * tds, const char *charset)
+ 	/* 
+ 	 * ISO8859-1 <-> server meta data
+ 	 */
+-	name = UCS_2LE;
++	canonic = TDS_CHARSET_UCS_2LE;
+ 	if (!IS_TDS7_PLUS(tds)) {
+-		name = "ISO-8859-1";
+-		if (tds->env.charset)
+-			name = tds->env.charset;
++		canonic = TDS_CHARSET_ISO_8859_1;
++		if (canonic_env_charset >= 0)
++			canonic = canonic_env_charset;
+ 	}
+-	tdsdump_log(TDS_DBG_FUNC, "preparing iconv for \"%s\" <-> \"%s\" conversion\n", "ISO-8859-1", name);
+-	fOK = tds_iconv_info_init(tds->char_convs[iso2server_metadata], "ISO-8859-1", name);
++	tdsdump_log(TDS_DBG_FUNC, "preparing iconv for \"%s\" <-> \"%s\" conversion\n", "ISO-8859-1", canonic_charsets[canonic].name);
++	fOK = tds_iconv_info_init(tds->char_convs[iso2server_metadata], TDS_CHARSET_ISO_8859_1, canonic);
+ 
+ 	tdsdump_log(TDS_DBG_FUNC, "tds_iconv_open: done\n");
+-#endif
+ }
+ 
+ /**
+@@ -423,30 +404,23 @@ tds_iconv_open(TDSSOCKET * tds, const char *charset)
+  *          not necessarily the names passed in. 
+  */
+ static int
+-tds_iconv_info_init(TDSICONV * char_conv, const char *client_name, const char *server_name)
++tds_iconv_info_init(TDSICONV * char_conv, int client_canonical, int server_canonical)
+ {
+ 	TDS_ENCODING *client = &char_conv->client_charset;
+ 	TDS_ENCODING *server = &char_conv->server_charset;
+ 
+-	int server_canonical, client_canonical;
+-
+-	assert(client_name && server_name);
+-
+ 	assert(char_conv->to_wire == (iconv_t) -1);
+ 	assert(char_conv->to_wire2 == (iconv_t) -1);
+ 	assert(char_conv->from_wire == (iconv_t) -1);
+ 	assert(char_conv->from_wire2 == (iconv_t) -1);
+ 
+-	client_canonical = tds_canonical_charset(client_name);
+-	server_canonical = tds_canonical_charset(server_name);
+-
+ 	if (client_canonical < 0) {
+-		tdsdump_log(TDS_DBG_FUNC, "tds_iconv_info_init: client charset name \"%s\" unrecognized\n", client_name);
++		tdsdump_log(TDS_DBG_FUNC, "tds_iconv_info_init: client charset name \"%d\" invalid\n", client_canonical);
+ 		return 0;
+ 	}
+ 
+ 	if (server_canonical < 0) {
+-		tdsdump_log(TDS_DBG_FUNC, "tds_iconv_info_init: server charset name \"%s\" unrecognized\n", server_name);
++		tdsdump_log(TDS_DBG_FUNC, "tds_iconv_info_init: server charset name \"%d\" invalid\n", server_canonical);
+ 		return 0;
+ 	}
+ 
+@@ -478,15 +452,15 @@ tds_iconv_info_init(TDSICONV * char_conv, const char *client_name, const char *s
+ 	/* get iconv names */
+ 	if (!iconv_names[client_canonical]) {
+ 		if (!tds_set_iconv_name(client_canonical)) {
+-			tdsdump_log(TDS_DBG_FUNC, "\"%s\" not supported by iconv, using \"%s\" instead\n",
+-						  client_name, iconv_names[client_canonical]);
++			tdsdump_log(TDS_DBG_FUNC, "Charset %d not supported by iconv, using \"%s\" instead\n",
++						  client_canonical, iconv_names[client_canonical]);
+ 		}
+ 	}
+ 	
+ 	if (!iconv_names[server_canonical]) {
+ 		if (!tds_set_iconv_name(server_canonical)) {
+-			tdsdump_log(TDS_DBG_FUNC, "\"%s\" not supported by iconv, using \"%s\" instead\n",
+-						  server_name, iconv_names[server_canonical]);
++			tdsdump_log(TDS_DBG_FUNC, "Charset %d not supported by iconv, using \"%s\" instead\n",
++						  server_canonical, iconv_names[server_canonical]);
+ 		}
+ 	}
+ 
+@@ -530,7 +504,6 @@ tds_iconv_info_init(TDSICONV * char_conv, const char *client_name, const char *s
+ }
+ 
+ 
+-#if HAVE_ICONV_ALWAYS
+ static void
+ _iconv_close(iconv_t * cd)
+ {
+@@ -550,18 +523,15 @@ tds_iconv_info_close(TDSICONV * char_conv)
+ 	_iconv_close(&char_conv->from_wire);
+ 	_iconv_close(&char_conv->from_wire2);
+ }
+-#endif
+ 
+ void
+ tds_iconv_close(TDSSOCKET * tds)
+ {
+-#if HAVE_ICONV_ALWAYS
+ 	int i;
+ 
+ 	for (i = 0; i < tds->char_conv_count; ++i) {
+ 		tds_iconv_info_close(tds->char_convs[i]);
+ 	}
+-#endif
+ }
+ 
+ #define CHUNK_ALLOC 4
+@@ -946,15 +916,15 @@ tds_iconv_fread(iconv_t cd, FILE * stream, size_t field_len, size_t term_len, ch
+  * Get a iconv info structure, allocate and initialize if needed
+  */
+ static TDSICONV *
+-tds_iconv_get_info(TDSSOCKET * tds, const char *canonic_client_charset, const char *canonic_server_charset)
++tds_iconv_get_info(TDSSOCKET * tds, int canonic_client, int canonic_server)
+ {
+ 	TDSICONV *info;
+ 	int i;
+ 
+ 	/* search a charset from already allocated charsets */
+ 	for (i = tds->char_conv_count; --i >= initial_char_conv_count;)
+-		if (strcmp(canonic_client_charset, tds->char_convs[i]->client_charset.name) == 0
+-		    && strcmp(canonic_server_charset, tds->char_convs[i]->server_charset.name) == 0)
++		if (canonic_client == tds->char_convs[i]->client_charset.canonic
++		    && canonic_server == tds->char_convs[i]->server_charset.canonic)
+ 			return tds->char_convs[i];
+ 
+ 	/* allocate a new iconv structure */
+@@ -980,9 +950,12 @@ tds_iconv_get_info(TDSSOCKET * tds, const char *canonic_client_charset, const ch
+ 	info = tds->char_convs[tds->char_conv_count++];
+ 
+ 	/* init */
+-	/* TODO test allocation */
+-	tds_iconv_info_init(info, canonic_client_charset, canonic_server_charset);
+-	return info;
++	if (tds_iconv_info_init(info, canonic_client, canonic_server))
++		return info;
++
++	tds_iconv_info_close(info);
++	--tds->char_conv_count;
++	return NULL;
+ }
+ 
+ TDSICONV *
+@@ -1000,36 +973,25 @@ tds_iconv_get(TDSSOCKET * tds, const char *client_charset, const char *server_ch
+ 		return NULL;
+ 	}
+ 
+-	return tds_iconv_get_info(tds, canonic_charsets[canonic_client_charset_num].name, canonic_charsets[canonic_server_charset_num].name);
++	return tds_iconv_get_info(tds, canonic_client_charset_num, canonic_server_charset_num);
+ }
+ 
+ /* change singlebyte conversions according to server */
+-void
+-tds_srv_charset_changed(TDSSOCKET * tds, const char *charset)
++static void
++tds_srv_charset_changed_num(TDSSOCKET * tds, int canonic_charset_num)
+ {
+-#if HAVE_ICONV_ALWAYS
+ 	TDSICONV *char_conv = tds->char_convs[client2server_chardata];
+ 
+-	int canonic_charset_num = tds_canonical_charset(charset);
+-	const char *canonic_charset;
+-
+ 	if (IS_TDS7_PLUS(tds) && canonic_charset_num == TDS_CHARSET_ISO_8859_1)
+ 		canonic_charset_num = TDS_CHARSET_CP1252;
+ 
+-	/* ignore request to change to unknown charset */
+-	if (canonic_charset_num < 0) {
+-		tdsdump_log(TDS_DBG_FUNC, "tds_srv_charset_changed: what is charset \"%s\"?\n", charset);
+-		return;
+-	}
+-	canonic_charset = canonic_charsets[canonic_charset_num].name;
+-
+-	tdsdump_log(TDS_DBG_FUNC, "setting server single-byte charset to \"%s\"\n", canonic_charset);
++	tdsdump_log(TDS_DBG_FUNC, "setting server single-byte charset to \"%s\"\n", canonic_charsets[canonic_charset_num].name);
+ 
+-	if (strcmp(canonic_charset, char_conv->server_charset.name) == 0)
++	if (canonic_charset_num == char_conv->server_charset.canonic)
+ 		return;
+ 
+ 	/* find and set conversion */
+-	char_conv = tds_iconv_get_info(tds, tds->char_convs[client2ucs2]->client_charset.name, canonic_charset);
++	char_conv = tds_iconv_get_info(tds, tds->char_convs[client2ucs2]->client_charset.canonic, canonic_charset_num);
+ 	if (char_conv)
+ 		tds->char_convs[client2server_chardata] = char_conv;
+ 
+@@ -1041,46 +1003,29 @@ tds_srv_charset_changed(TDSSOCKET * tds, const char *charset)
+ 
+ 	tds_iconv_info_close(char_conv);
+ 
+-	tds_iconv_info_init(char_conv, "ISO-8859-1", charset);
+-#endif
++	tds_iconv_info_init(char_conv, TDS_CHARSET_ISO_8859_1, canonic_charset_num);
+ }
+ 
+-/* change singlebyte conversions according to server */
+ void
+-tds7_srv_charset_changed(TDSSOCKET * tds, int sql_collate, int lcid)
+-{
+-	tds_srv_charset_changed(tds, collate2charset(sql_collate, lcid));
+-}
+-
+-#if !HAVE_ICONV_ALWAYS
+-/**
+- * Determine byte/char for an iconv character set.  
+- * \retval 0 failed, no such charset.
+- * \retval 1 succeeded, fixed byte/char.
+- * \retval 2 succeeded, variable byte/char.
+- */
+-static int
+-bytes_per_char(TDS_ENCODING * charset)
++tds_srv_charset_changed(TDSSOCKET * tds, const char *charset)
+ {
+-	int i;
++	int n = tds_canonical_charset(charset);
+ 
+-	assert(charset && strlen(charset->name) < sizeof(charset->name));
+-
+-	for (i = 0; i < sizeof(canonic_charsets) / sizeof(TDS_ENCODING); i++) {
+-		if (canonic_charsets[i].min_bytes_per_char == 0)
+-			break;
+-
+-		if (0 == strcmp(charset->name, canonic_charsets[i].name)) {
+-			charset->min_bytes_per_char = canonic_charsets[i].min_bytes_per_char;
+-			charset->max_bytes_per_char = canonic_charsets[i].max_bytes_per_char;
+-
+-			return (charset->max_bytes_per_char == charset->min_bytes_per_char) ? 1 : 2;
+-		}
++	/* ignore request to change to unknown charset */
++	if (n < 0) {
++		tdsdump_log(TDS_DBG_FUNC, "tds_srv_charset_changed: what is charset \"%s\"?\n", charset);
++		return;
+ 	}
+ 
+-	return 0;
++	tds_srv_charset_changed_num(tds, n);
++}
++
++/* change singlebyte conversions according to server */
++void
++tds7_srv_charset_changed(TDSSOCKET * tds, int sql_collate, int lcid)
++{
++	tds_srv_charset_changed_num(tds, collate2charset(sql_collate, lcid));
+ }
+-#endif
+ 
+ /**
+  * Move the input sequence pointer to the next valid position.
+@@ -1257,7 +1202,7 @@ tds_sybase_charset_name(const char *charset_name)
+ 	return NULL;
+ }
+ 
+-static const char *
++static int
+ collate2charset(int sql_collate, int lcid)
+ {
+ 	/*
+@@ -1265,7 +1210,7 @@ collate2charset(int sql_collate, int lcid)
+ 	 * and from " NLS Information for Microsoft Windows XP"
+ 	 */
+ 
+-	const char *cp = NULL;
++	int cp = 0;
+ 
+ 	switch (sql_collate) {
+ 	case 30:		/* SQL_Latin1_General_CP437_BIN */
+@@ -1273,7 +1218,7 @@ collate2charset(int sql_collate, int lcid)
+ 	case 32:		/* SQL_Latin1_General_CP437_CI_AS */
+ 	case 33:		/* SQL_Latin1_General_Pref_CP437_CI_AS */
+ 	case 34:		/* SQL_Latin1_General_CP437_CI_AI */
+-		return "CP437";
++		return TDS_CHARSET_CP437;
+ 	case 40:		/* SQL_Latin1_General_CP850_BIN */
+ 	case 41:		/* SQL_Latin1_General_CP850_CS_AS */
+ 	case 42:		/* SQL_Latin1_General_CP850_CI_AS */
+@@ -1287,29 +1232,30 @@ collate2charset(int sql_collate, int lcid)
+ 	case 59:		/* SQL_Scandinavian_CP850_CS_AS */
+ 	case 60:		/* SQL_Scandinavian_CP850_CI_AS */
+ 	case 61:		/* SQL_AltDiction_CP850_CI_AS */
+-		return "CP850";
++		return TDS_CHARSET_CP850;
++	case 80:		/* SQL_Latin1_General_1250_BIN */
+ 	case 81:		/* SQL_Latin1_General_CP1250_CS_AS */
+ 	case 82:		/* SQL_Latin1_General_CP1250_CI_AS */
+-		return "CP1250";
++		return TDS_CHARSET_CP1250;
+ 	case 105:		/* SQL_Latin1_General_CP1251_CS_AS */
+ 	case 106:		/* SQL_Latin1_General_CP1251_CI_AS */
+-		return "CP1251";
++		return TDS_CHARSET_CP1251;
+ 	case 113:		/* SQL_Latin1_General_CP1253_CS_AS */
+ 	case 114:		/* SQL_Latin1_General_CP1253_CI_AS */
+ 	case 120:		/* SQL_MixDiction_CP1253_CS_AS */
+ 	case 121:		/* SQL_AltDiction_CP1253_CS_AS */
+ 	case 122:		/* SQL_AltDiction2_CP1253_CS_AS */
+ 	case 124:		/* SQL_Latin1_General_CP1253_CI_AI */
+-		return "CP1253";
++		return TDS_CHARSET_CP1253;
+ 	case 137:		/* SQL_Latin1_General_CP1255_CS_AS */
+ 	case 138:		/* SQL_Latin1_General_CP1255_CI_AS */
+-		return "CP1255";
++		return TDS_CHARSET_CP1255;
+ 	case 145:		/* SQL_Latin1_General_CP1256_CS_AS */
+ 	case 146:		/* SQL_Latin1_General_CP1256_CI_AS */
+-		return "CP1256";
++		return TDS_CHARSET_CP1256;
+ 	case 153:		/* SQL_Latin1_General_CP1257_CS_AS */
+ 	case 154:		/* SQL_Latin1_General_CP1257_CI_AS */
+-		return "CP1257";
++		return TDS_CHARSET_CP1257;
+ 	}
+ 
+ 	switch (lcid & 0xffff) {
+@@ -1323,7 +1269,7 @@ collate2charset(int sql_collate, int lcid)
+ 	case 0x424:
+ 		/* case 0x81a: seem wrong in XP table TODO check */
+ 	case 0x104e:		/* ?? */
+-		cp = "CP1250";
++		cp = TDS_CHARSET_CP1250;
+ 		break;
+ 	case 0x402:
+ 	case 0x419:
+@@ -1338,7 +1284,7 @@ collate2charset(int sql_collate, int lcid)
+ 	case 0x82c:
+ 	case 0x843:
+ 	case 0xc1a:
+-		cp = "CP1251";
++		cp = TDS_CHARSET_CP1251;
+ 		break;
+ 	case 0x1007:
+ 	case 0x1009:
+@@ -1408,18 +1354,18 @@ collate2charset(int sql_collate, int lcid)
+ 	case 0xc09:
+ 	case 0xc0a:
+ 	case 0xc0c:
+-		cp = "CP1252";
++		cp = TDS_CHARSET_CP1252;
+ 		break;
+ 	case 0x408:
+-		cp = "CP1253";
++		cp = TDS_CHARSET_CP1253;
+ 		break;
+ 	case 0x41f:
+ 	case 0x42c:
+ 	case 0x443:
+-		cp = "CP1254";
++		cp = TDS_CHARSET_CP1254;
+ 		break;
+ 	case 0x40d:
+-		cp = "CP1255";
++		cp = TDS_CHARSET_CP1255;
+ 		break;
+ 	case 0x1001:
+ 	case 0x1401:
+@@ -1439,40 +1385,39 @@ collate2charset(int sql_collate, int lcid)
+ 	case 0x429:
+ 	case 0x801:
+ 	case 0xc01:
+-		cp = "CP1256";
++		cp = TDS_CHARSET_CP1256;
+ 		break;
+ 	case 0x425:
+ 	case 0x426:
+ 	case 0x427:
+ 	case 0x827:		/* ?? */
+-		cp = "CP1257";
++		cp = TDS_CHARSET_CP1257;
+ 		break;
+ 	case 0x42a:
+-		cp = "CP1258";
++		cp = TDS_CHARSET_CP1258;
+ 		break;
+ 	case 0x41e:
+-		cp = "CP874";
++		cp = TDS_CHARSET_CP874;
+ 		break;
+ 	case 0x411:		/* 0x10411 */
+-		cp = "CP932";
++		cp = TDS_CHARSET_CP932;
+ 		break;
+ 	case 0x1004:
+ 	case 0x804:		/* 0x20804 */
+-		cp = "CP936";
++		cp = TDS_CHARSET_CP936;
+ 		break;
+ 	case 0x412:		/* 0x10412 */
+-		cp = "CP949";
++		cp = TDS_CHARSET_CP949;
+ 		break;
+ 	case 0x1404:
+ 	case 0x404:		/* 0x30404 */
+ 	case 0xc04:
+-		cp = "CP950";
++		cp = TDS_CHARSET_CP950;
+ 		break;
+ 	default:
+-		cp = "CP1252";
++		cp = TDS_CHARSET_CP1252;
+ 	}
+ 
+-	assert(cp);
+ 	return cp;
+ }
+ 
+@@ -1484,17 +1429,13 @@ tds_iconv_from_collate(TDSSOCKET * tds, TDS_UCHAR collate[5])
+ {
+ 	const int sql_collate = collate[4];
+ 	const int lcid = collate[1] * 256 + collate[0];
+-	const char *charset = collate2charset(sql_collate, lcid);
+-
+-#if ENABLE_EXTRA_CHECKS
+-	assert(strcmp(tds_canonical_charset_name(charset), charset) == 0);
+-#endif
++	int canonic_charset = collate2charset(sql_collate, lcid);
+ 
+ 	/* same as client (usually this is true, so this improve performance) ? */
+-	if (strcmp(tds->char_convs[client2server_chardata]->server_charset.name, charset) == 0)
++	if (tds->char_convs[client2server_chardata]->server_charset.canonic == canonic_charset)
+ 		return tds->char_convs[client2server_chardata];
+ 
+-	return tds_iconv_get_info(tds, tds->char_convs[client2ucs2]->client_charset.name, charset);
++	return tds_iconv_get_info(tds, tds->char_convs[client2ucs2]->client_charset.canonic, canonic_charset);
+ }
+ 
+ /** @} */