List:Commits« Previous MessageNext Message »
From:lnovitsky Date:October 17 2007 9:28pm
Subject:Connector/ODBC 3.51 commit: r824 - in branches/guffert/wingui: dialog odbcdialogparams setup util
View as plain text  
Modified:
   branches/guffert/wingui/dialog/callbacks.cpp
   branches/guffert/wingui/dialog/callbacks.h
   branches/guffert/wingui/dialog/utils.cpp
   branches/guffert/wingui/dialog/utils.h
   branches/guffert/wingui/odbcdialogparams/main.cpp
   branches/guffert/wingui/odbcdialogparams/myString.cpp
   branches/guffert/wingui/odbcdialogparams/myString.h
   branches/guffert/wingui/odbcdialogparams/odbcdialogparams.cpp
   branches/guffert/wingui/odbcdialogparams/odbcdialogparams.h
   branches/guffert/wingui/odbcdialogparams/odbcdialogparams.rc
   branches/guffert/wingui/odbcdialogparams/odbcdialogparams.vcproj
   branches/guffert/wingui/odbcdialogparams/resource.h
   branches/guffert/wingui/setup/MYODBCSetupConfigDSNAdd.c
   branches/guffert/wingui/setup/MYODBCSetupConfigDSNEdit.c
   branches/guffert/wingui/setup/myodbc3S.vcproj
   branches/guffert/wingui/util/installer.c
   branches/guffert/wingui/util/installer.h
   branches/guffert/wingui/util/stringutil.c
   branches/guffert/wingui/util/stringutil.h
Log:
unverified and untested move from OdbcDialogParams to DataSource

Modified: branches/guffert/wingui/dialog/callbacks.cpp
===================================================================
--- branches/guffert/wingui/dialog/callbacks.cpp	2007-10-17 04:49:28 UTC (rev 823)
+++ branches/guffert/wingui/dialog/callbacks.cpp	2007-10-17 21:28:57 UTC (rev 824)
@@ -30,7 +30,7 @@
 	clearList(errorMsgs);
 }
 
-const wchar_t * mytest(HWND hwnd, OdbcDialogParams* params)
+const wchar_t * mytest(HWND hwnd, DataSource* params)
 {
 	SQLHDBC hDbc = hDBC;
 	SQLHENV hEnv = SQL_NULL_HENV;
@@ -39,21 +39,27 @@
 		return L"Connection successful";
 	else
 	{
-		strAssign(popupMsg, concat(myString(L"Connection Failed:"), popupMsg ) );
+        myString tmp = NULL;
 
-		return popupMsg.c_str();
+        strAssign(tmp,myString(L"Connection Failed:"));
+
+		strAssign(popupMsg, concat( tmp, popupMsg ) );
+
+        x_free( tmp );
+
+		return popupMsg;
 	}
 
 	Disconnect( hDbc, hEnv );
 	//MessageBox(hwnd, params->dbname.c_str(), params->drvdesc.c_str(), MB_OK);
 }
 
-BOOL mytestaccept(HWND hwnd, OdbcDialogParams* params)
+BOOL mytestaccept(HWND hwnd, DataSource* params)
 {
 	return true/*(IDYES == MessageBoxW(hwnd, params->dbname.c_str(),
params->drvdesc.c_str(), MB_YESNO))*/;
 }
 
-const WCHAR** mygetdatabases(HWND hwnd, OdbcDialogParams* params)
+const WCHAR** mygetdatabases(HWND hwnd, DataSource* params)
 {
 	// = { L"DB1", L"DB2", NULL };
 

Modified: branches/guffert/wingui/dialog/callbacks.h
===================================================================
--- branches/guffert/wingui/dialog/callbacks.h	2007-10-17 04:49:28 UTC (rev 823)
+++ branches/guffert/wingui/dialog/callbacks.h	2007-10-17 21:28:57 UTC (rev 824)
@@ -11,10 +11,10 @@
 		void		cleanUp();
 
 // Callbacks indeed
-const	wchar_t *	mytest			(HWND hwnd, OdbcDialogParams* params);
-		BOOL		mytestaccept	(HWND hwnd, OdbcDialogParams* params);
-		/*BOOL		mytestaccept	(HWND hwnd, OdbcDialogParams* params);*/
-const	WCHAR**		mygetdatabases	(HWND hwnd, OdbcDialogParams* params);
+const	wchar_t *	mytest			(HWND hwnd, DataSource* params);
+		BOOL		mytestaccept	(HWND hwnd, DataSource* params);
+		/*BOOL		mytestaccept	(HWND hwnd, DataSource* params);*/
+const	WCHAR**		mygetdatabases	(HWND hwnd, DataSource* params);
 		void		myhelp			(HWND hwnd);
 
 

Modified: branches/guffert/wingui/dialog/utils.cpp
===================================================================
--- branches/guffert/wingui/dialog/utils.cpp	2007-10-17 04:49:28 UTC (rev 823)
+++ branches/guffert/wingui/dialog/utils.cpp	2007-10-17 21:28:57 UTC (rev 824)
@@ -33,84 +33,35 @@
 extern	WCHAR **		errorMsgs;
 extern	myString		popupMsg;
 
-void DS2DialogParams(DataSource &src, OdbcDialogParams &target)
+void DecompileOptions(DataSource &params)
 {
-	strAssign( target.drvname, src.driver );
-    strAssign( target.dsname, src.name );
-	strAssign(target.drvdesc, src.description);
-	strAssign(target.srvname, src.server);
+	ulong nOptions = sqlwchartoul( params.option );
 
-	target.port = src.port;
-
-	strAssign(target.dbname, src.database);
-	strAssign(target.username, src.uid);
-	strAssign(target.password, src.pwd);
-	strAssign(target.socket, src.socket);
-
-	strAssign(target.sslkey, src.sslkey);
-	strAssign(target.sslcert, src.sslcert);
-	strAssign(target.sslca, src.sslca);
-	strAssign(target.sslcapath, src.sslcapath);
-	strAssign(target.sslcipher, src.sslcipher);
-
-	strAssign(target.initstmt, src.initstmt);
-	strAssign(target.charset, src.charset);
-
-	ulong nOptions = sqlwchartoul( src.option );
-
-    target.dont_optimize_column_width=				(nOptions & FLAG_FIELD_LENGTH) > 0;
-    target.return_matching_rows=                    (nOptions & FLAG_FOUND_ROWS) >
0;  /* 2 */
-	target.allow_big_results=						(nOptions & FLAG_BIG_PACKETS) > 0;
-	target.dont_prompt_upon_connect=				(nOptions & FLAG_NO_PROMPT) > 0;
-	target.enable_dynamic_cursor=					(nOptions & FLAG_DYNAMIC_CURSOR) > 0;
-	target.ignore_N_in_name_table=					(nOptions & FLAG_NO_SCHEMA) > 0;
-	target.user_manager_cursor=						(nOptions & FLAG_NO_DEFAULT_CURSOR) > 0;
-	target.dont_use_set_locale=						(nOptions & FLAG_NO_LOCALE) > 0;
-	target.pad_char_to_full_length=					(nOptions & FLAG_PAD_SPACE) > 0;
-	target.return_table_names_for_SqlDesribeCol=    (nOptions & FLAG_FULL_COLUMN_NAMES)
> 0;
-	target.use_compressed_protocol=					(nOptions & FLAG_COMPRESSED_PROTO) > 0;
-	target.ignore_space_after_function_names=		(nOptions & FLAG_IGNORE_SPACE) > 0; 
-	target.force_use_of_named_pipes=				(nOptions & FLAG_NAMED_PIPE) > 0;          
-	target.change_bigint_columns_to_int=			(nOptions & FLAG_NO_BIGINT) > 0;
-	target.no_catalog=								(nOptions & FLAG_NO_CATALOG) > 0;
-	target.read_options_from_mycnf=					(nOptions & FLAG_USE_MYCNF) > 0;          
-	target.safe=									(nOptions & FLAG_SAFE) > 0;
-	target.disable_transactions=					(nOptions & FLAG_NO_TRANSACTIONS) > 0;          

-	target.save_queries=							(nOptions & FLAG_LOG_QUERY) > 0;
-	target.dont_cache_result=						(nOptions & FLAG_NO_CACHE) > 0;
-	target.force_use_of_forward_only_cursors=		(nOptions & FLAG_FORWARD_CURSOR) > 0; 

-	target.enable_auto_reconnect=					(nOptions & FLAG_AUTO_RECONNECT) > 0;
-	target.enable_auto_increment_null_search=		(nOptions & FLAG_AUTO_IS_NULL ) > 0;
+    params.dont_optimize_column_width=				(nOptions & FLAG_FIELD_LENGTH) > 0;
+    params.return_matching_rows=                    (nOptions & FLAG_FOUND_ROWS) >
0;  /* 2 */
+	params.allow_big_results=						(nOptions & FLAG_BIG_PACKETS) > 0;
+	params.dont_prompt_upon_connect=				(nOptions & FLAG_NO_PROMPT) > 0;
+	params.enable_dynamic_cursor=					(nOptions & FLAG_DYNAMIC_CURSOR) > 0;
+	params.ignore_N_in_name_table=					(nOptions & FLAG_NO_SCHEMA) > 0;
+	params.user_manager_cursor=						(nOptions & FLAG_NO_DEFAULT_CURSOR) > 0;
+	params.dont_use_set_locale=						(nOptions & FLAG_NO_LOCALE) > 0;
+	params.pad_char_to_full_length=					(nOptions & FLAG_PAD_SPACE) > 0;
+	params.return_table_names_for_SqlDesribeCol=    (nOptions & FLAG_FULL_COLUMN_NAMES)
> 0;
+	params.use_compressed_protocol=					(nOptions & FLAG_COMPRESSED_PROTO) > 0;
+	params.ignore_space_after_function_names=		(nOptions & FLAG_IGNORE_SPACE) > 0; 
+	params.force_use_of_named_pipes=				(nOptions & FLAG_NAMED_PIPE) > 0;          
+	params.change_bigint_columns_to_int=			(nOptions & FLAG_NO_BIGINT) > 0;
+	params.no_catalog=								(nOptions & FLAG_NO_CATALOG) > 0;
+	params.read_options_from_mycnf=					(nOptions & FLAG_USE_MYCNF) > 0;          
+	params.safe=									(nOptions & FLAG_SAFE) > 0;
+	params.disable_transactions=					(nOptions & FLAG_NO_TRANSACTIONS) > 0;          

+	params.save_queries=							(nOptions & FLAG_LOG_QUERY) > 0;
+	params.dont_cache_result=						(nOptions & FLAG_NO_CACHE) > 0;
+	params.force_use_of_forward_only_cursors=		(nOptions & FLAG_FORWARD_CURSOR) > 0; 

+	params.enable_auto_reconnect=					(nOptions & FLAG_AUTO_RECONNECT) > 0;
+	params.enable_auto_increment_null_search=		(nOptions & FLAG_AUTO_IS_NULL ) > 0;
 }
 
-void DialogParams2DS( OdbcDialogParams &src, DataSource &target )
-{
-    //TODO: should make copy probably
-	target.name=		(SQLWCHAR*)src.dsname.c_str();
-	target.description=	(SQLWCHAR*)src.drvdesc.c_str();
-	target.server=		(SQLWCHAR*)src.srvname.c_str();
-
-	target.port=		src.port;
-
-	target.database=	(SQLWCHAR*)src.dbname.c_str();
-	target.uid=			(SQLWCHAR*)src.username.c_str();
-	target.pwd=			(SQLWCHAR*)src.password.c_str();
-	target.socket=		(SQLWCHAR*)src.socket.c_str();
-
-	target.sslkey=		(SQLWCHAR*)src.sslkey.c_str();
-	target.sslcert=		(SQLWCHAR*)src.sslcert.c_str();
-	target.sslca=		(SQLWCHAR*)src.sslca.c_str();
-	target.sslcapath=	(SQLWCHAR*)src.sslcapath.c_str();
-	target.sslcipher=	(SQLWCHAR*)src.sslcipher.c_str();
-
-	target.initstmt=	(SQLWCHAR*)src.initstmt.c_str();
-	target.charset=		(SQLWCHAR*)src.charset.c_str();
-
-    unsigned long nOptions = CompileOptions( &src );
-    target.option = L"";
-}
-
-
 void FreeEnvHandle( SQLHENV &hEnv )
 {
 	if ( hDBC == SQL_NULL_HDBC )
@@ -137,12 +88,12 @@
 }
 
 
-const myString & buildConnectString( OdbcDialogParams* params )
+const myString & buildConnectString( DataSource* params )
 {
 	stringConnectIn = L"DRIVER=";
 
-    if ( myStrlen(params->drvname) > 0 )
-        concat(stringConnectIn, params->drvname);
+    if ( myStrlen(params->driver) > 0 )
+        concat(stringConnectIn, params->driver);
     else
 	    concat( stringConnectIn, MYODBCINST_DRIVER_NAME );
 
@@ -204,14 +155,14 @@
 	concat(stringConnectIn, params->drvname );//pDataSource->pszDRIVER);*/
 #endif
 
-	concat( concat( stringConnectIn, L";UID=" ), params->username );
+	concat( concat( stringConnectIn, L";UID=" ), params->uid );
 
-	concat( concat( stringConnectIn, L";PWD=" ), params->password );
+	concat( concat( stringConnectIn, L";PWD=" ), params->pwd );
 
-	concat( concat( stringConnectIn, L";SERVER=" ), params->srvname );
+	concat( concat( stringConnectIn, L";SERVER=" ), params->server );
 
-	if ( myStrlen( params->dbname ) )
-		concat( concat( stringConnectIn, L";DATABASE="), params->dbname );
+	if ( myStrlen( params->database ) )
+		concat( concat( stringConnectIn, L";DATABASE="), params->database );
 
 	if ( params->port > 0 )
 	{
@@ -241,7 +192,7 @@
 }
 
 
-SQLRETURN Connect( SQLHDBC  &   hDbc, SQLHENV   &  hEnv, OdbcDialogParams *
params )
+SQLRETURN Connect( SQLHDBC  &   hDbc, SQLHENV   &  hEnv, DataSource * params )
 {
 	SQLRETURN   nReturn;
 	//			QStringList stringlistDatabases;
@@ -277,7 +228,7 @@
 		}
 	}
 
-	nReturn = SQLDriverConnectW( hDbc, NULL, (SQLWCHAR*)( stringConnectIn.c_str() ),
SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT );
+	nReturn = SQLDriverConnectW( hDbc, NULL, (SQLWCHAR*)( stringConnectIn ), SQL_NTS, NULL,
0, NULL, SQL_DRIVER_NOPROMPT );
 
 	if ( nReturn != SQL_SUCCESS )
 		ShowDiagnostics( nReturn, SQL_HANDLE_DBC, hDbc );
@@ -340,7 +291,7 @@
 }
 
 
-unsigned long CompileOptions( OdbcDialogParams * params )
+unsigned long CompileOptions( DataSource * params )
 {
 	unsigned long nFlags = 0;
 

Modified: branches/guffert/wingui/dialog/utils.h
===================================================================
--- branches/guffert/wingui/dialog/utils.h	2007-10-17 04:49:28 UTC (rev 823)
+++ branches/guffert/wingui/dialog/utils.h	2007-10-17 21:28:57 UTC (rev 824)
@@ -13,10 +13,9 @@
 void				FreeEnvHandle		( SQLHENV &hEnv );
 void				Disconnect			( SQLHDBC &hDbc, SQLHENV &hEnv  );
 void				Disconnect			( SQLHSTMT &hStmt, SQLHDBC &hDbc, SQLHENV &hEnv  );
-const myString &	buildConnectString	( OdbcDialogParams* params );
-SQLRETURN			Connect				( SQLHDBC  &   hDbc, SQLHENV   &  hEnv, OdbcDialogParams *
params );
-unsigned long		CompileOptions		( OdbcDialogParams * params );
-void				DS2DialogParams		( DataSource &src, OdbcDialogParams &target );
-void				DialogParams2DS		( OdbcDialogParams &src, DataSource &target );
+const myString &	buildConnectString	( DataSource* params );
+SQLRETURN			Connect				( SQLHDBC  &   hDbc, SQLHENV   &  hEnv, DataSource *
params );
+unsigned long		CompileOptions		( DataSource * params );
+void				DecompileOptions	( DataSource &src );
 
 #endif

Modified: branches/guffert/wingui/odbcdialogparams/main.cpp
===================================================================
--- branches/guffert/wingui/odbcdialogparams/main.cpp	2007-10-17 04:49:28 UTC (rev 823)
+++ branches/guffert/wingui/odbcdialogparams/main.cpp	2007-10-17 21:28:57 UTC (rev 824)
@@ -1,6 +1,6 @@
+#include "stdafx.h"
 #include <winsock2.h>
-#include "mysql.h"
-#include "stdafx.h"
+#include <mysql.h>
 #include "resource.h"
 
 #ifdef _MANAGED

Modified: branches/guffert/wingui/odbcdialogparams/myString.cpp
===================================================================
--- branches/guffert/wingui/odbcdialogparams/myString.cpp	2007-10-17 04:49:28 UTC (rev
823)
+++ branches/guffert/wingui/odbcdialogparams/myString.cpp	2007-10-17 21:28:57 UTC (rev
824)
@@ -93,5 +93,89 @@
 }
 
 #else
-/*** will need to write for wchar_t* later when we will actually switch to it from
wstring */
+
+myString & concat( myString &left, const myString &right )
+{
+    size_t len = myStrlen(right);
+    my_realloc((gptr)left,myStrlen(left)+myStrlen(right)+1, MY_ALLOW_ZERO_PTR);
+    sqlwcharncat2(left, right, &len );
+    //return left.length();
+    return left;
+}
+
+size_t myStrlen( const myString & str )
+{
+    return sqlwcharlen( str );
+}
+
+myString & strAssign	( myString &dest, const wchar_t * src )
+{
+    if (src != NULL)
+        return strAssign( dest, myString( src ) );
+    else
+    {
+        dest= L"";
+        return dest;
+    }
+}
+
+myString & strAssign( myString &dest, const myString & src )
+{
+    if ( dest )
+        x_free(dest);
+    dest = sqlwchardup( src, myStrlen( src ));
+
+    return dest;
+}
+
+void add2list( WCHAR ** & list, const wchar_t * newmember )
+{
+    size_t pos = listSize( (const WCHAR **) list);
+
+    WCHAR** prev = list;
+
+    list = (WCHAR **) realloc( list, (pos + 1 + 1)*sizeof(WCHAR*) );
+
+    if ( list == NULL )
+    {
+        clearList( prev );
+        return;
+    }
+
+    list[ pos + 1 ] = NULL;
+
+    size_t len = wcslen(newmember);
+    wchar_t *realnew = (wchar_t*)malloc(sizeof(wchar_t)*( len + 1 ) );
+
+    wcsncpy( realnew, newmember, len + 1 );
+
+    list[pos] = realnew;
+}
+
+void clearList( WCHAR ** & list )
+{
+    if ( ! list )
+        return;
+
+    for ( unsigned i = 0; list[ i ]; ++i )
+    {
+        free( list[i] );
+    }
+
+    free( list );
+
+    list = NULL;
+}
+
+size_t	listSize( const WCHAR ** list )
+{
+    if ( ! list )
+        return 0;/*InvalidSize*/;
+
+    size_t size = 0;
+
+    while ( list[size] ) ++size;
+
+    return size;
+}
 #endif
\ No newline at end of file

Modified: branches/guffert/wingui/odbcdialogparams/myString.h
===================================================================
--- branches/guffert/wingui/odbcdialogparams/myString.h	2007-10-17 04:49:28 UTC (rev 823)
+++ branches/guffert/wingui/odbcdialogparams/myString.h	2007-10-17 21:28:57 UTC (rev 824)
@@ -12,9 +12,10 @@
 
 /** Type definitions and includes if _do_not_ use string class*/
 
-#include <string.h>
-#typedef wchar_t*			myString;
+#include "../util/stringutil.h"
 
+typedef SQLWCHAR*			myString;
+
 #endif /*using wstring or wchar_t **/
 
 /*myString & operator += ( myString & lhs, const wchar_t * rhs);*/
@@ -30,7 +31,7 @@
 
 myString &  concat      ( myString &left, const myString &right );
 
-size_t      myStrlen    ( myString & str );
+size_t      myStrlen    ( const myString & str );
 
 myString &  strAssign   ( myString &dest, const myString & src );
 myString &  strAssign   ( myString &dest, const wchar_t * src );

Modified: branches/guffert/wingui/odbcdialogparams/odbcdialogparams.cpp
===================================================================
--- branches/guffert/wingui/odbcdialogparams/odbcdialogparams.cpp	2007-10-17 04:49:28 UTC
(rev 823)
+++ branches/guffert/wingui/odbcdialogparams/odbcdialogparams.cpp	2007-10-17 21:28:57 UTC
(rev 824)
@@ -12,7 +12,7 @@
 #include <windows.h>
 #include <windowsx.h>
 #include <commctrl.h>
-#include <tchar.h>
+/* #include <tchar.h> */
 #include <stdio.h>
 #include "resource.h"
 #include "TabCtrl.h"
@@ -20,11 +20,12 @@
 #include <assert.h>
 #include <commdlg.h>
 #include <shlobj.h>
+#include <xstring>
 
 
 extern HINSTANCE ghInstance;
 
-OdbcDialogParams* pParams = NULL;
+DataSource* pParams = NULL;
 PWCHAR pCaption = NULL;
 bool OkPressed = false;
 
@@ -60,13 +61,13 @@
 
 
 #define DO_DATA_EXCHANGE do {\
-	SET_STRING(dsname);\
-	SET_STRING(drvdesc);\
-	SET_STRING(srvname);\
+	SET_STRING(name);\
+	SET_STRING(description);\
+	SET_STRING(server);\
 	SET_UNSIGNED(port);\
-	SET_STRING(username);\
-	SET_STRING(password);\
-	SET_STRING(dbname);\
+	SET_STRING(uid);\
+	SET_STRING(pwd);\
+	SET_STRING(database);\
 	SET_STRING(sslkey)\
 	SET_STRING(sslcert);\
 	SET_STRING(sslca);\
@@ -143,16 +144,16 @@
 	return FALSE;
 }
 
-void FillParameters(HWND hwnd, OdbcDialogParams& params)
+void FillParameters(HWND hwnd, DataSource & params)
 {
 /** need also to resize, cuz otherwise string thinks it's zero length*/
 #define SET_STRING(param) { \
-	params.param = L""; \
+	if (params.param)\
+        *(params.param) = NULL; \
 	int len = Edit_GetTextLength(GetDlgItem(hwnd,IDC_EDIT_##param)); \
 	if(len>0) { \
-		params.param.reserve(len+1);\
-		params.param.resize(len);\
-		Edit_GetText(GetDlgItem(hwnd,IDC_EDIT_##param), (LPWSTR)params.param.c_str(), len+1);}}
+		my_realloc(params.param, len+1, 64 );\
+		Edit_GetText(GetDlgItem(hwnd,IDC_EDIT_##param), (LPWSTR)params.param, len+1);}}
 
 #define SET_UNSIGNED(param) { \
 	params.param = 0U; \
@@ -237,9 +238,9 @@
 {
 	if ( gAcceptParamsCallback ) 
 	{
-		OdbcDialogParams params;
-		FillParameters(hwnd, params);
-		if( (*gAcceptParamsCallback)( hwnd, &params ) )
+		/*DataSource params;*/
+		FillParameters(hwnd, *pParams);
+		if( (*gAcceptParamsCallback)( hwnd, pParams ) )
 		{
 			OkPressed = true;
 			PostMessage(hwnd, WM_CLOSE, NULL, NULL);
@@ -257,15 +258,15 @@
 {
 	if(gTestButtonPressedCallback)
 	{
-		OdbcDialogParams params;
-		FillParameters(hwnd, params);
+		/*OdbcDialogParams params;*/
+		FillParameters(hwnd, *pParams);
 
-        if ( pParams )
-            params.drvname= pParams->drvname;
+        /*if ( pParams )
+            params.driver= pParams->driver;*/
 
-		const wchar_t * testResultMsg = (*gTestButtonPressedCallback)( hwnd, &params );
+		const wchar_t * testResultMsg = (*gTestButtonPressedCallback)( hwnd, pParams );
 
-		MessageBoxW( hwnd, testResultMsg, params.dsname.c_str(), MB_OK );
+		MessageBoxW( hwnd, testResultMsg, pParams->name, MB_OK );
 	}
 }
 
@@ -362,10 +363,10 @@
 			chooseFile( hwnd, IDC_EDIT_sslca ); break;
 		case IDC_SSLCAPATHCHOOSER:
 			choosePath( hwnd, IDC_EDIT_sslcapath ); break;
-		case IDC_EDIT_dsname:
+		case IDC_EDIT_name:
 		{
 			if (codeNotify==EN_CHANGE) {
-				int len = Edit_GetTextLength(GetDlgItem(hwnd,IDC_EDIT_dsname));
+				int len = Edit_GetTextLength(GetDlgItem(hwnd,IDC_EDIT_name));
 				Button_Enable(GetDlgItem(hwnd,IDOK), len > 0);
 				Button_Enable(GetDlgItem(hwnd,IDC_BUTTON_TEST), len > 0);
 				RedrawWindow(hwnd,NULL,NULL,RDW_INVALIDATE);	
@@ -376,9 +377,9 @@
 		case IDC_EDIT_dbname:
 		{
 			if(codeNotify==CBN_DROPDOWN && gDatabaseNamesCallback) {
-				OdbcDialogParams params;
-				FillParameters(hwnd, params);
-				const WCHAR** items = gDatabaseNamesCallback( hwnd, &params );
+				/*OdbcDialogParams params;*/
+				FillParameters(hwnd, *pParams);
+				const WCHAR** items = gDatabaseNamesCallback( hwnd, pParams );
 				if( items )
 				{
 					ComboBox_ResetContent(hwndCtl);
@@ -461,7 +462,7 @@
 	//in order to fix the minimum size of dialog
 
 #define SET_STRING(param) \
-	Edit_SetText(GetDlgItem(hwnd,IDC_EDIT_##param), pParams->param.c_str());
+	Edit_SetText(GetDlgItem(hwnd,IDC_EDIT_##param), pParams->param);
 
 #define SET_UNSIGNED(param) { \
 	wchar_t buf[1024]; \
@@ -477,6 +478,9 @@
 
 BOOL FormMain_DlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
 {
+    int *i;
+    i = (int*)0x1003879e;
+
 	switch(msg)
 	{
 		HANDLE_MSG (hwndDlg, WM_CLOSE, FormMain_OnClose);
@@ -495,7 +499,7 @@
 // returns FALSE if 'cancel' button pressed
 int ShowOdbcParamsDialog(
     PWCHAR caption,
-	OdbcDialogParams* params,                  /*[inout]*/
+	DataSource* params,                  /*[inout]*/
 	HWND ParentWnd,                     /* [in] could be NULL */
 	HelpButtonPressedCallbackType* hcallback, /* [in] could be NULL */
 	TestButtonPressedCallbackType* tcallback, /* [in] could be NULL */

Modified: branches/guffert/wingui/odbcdialogparams/odbcdialogparams.h
===================================================================
--- branches/guffert/wingui/odbcdialogparams/odbcdialogparams.h	2007-10-17 04:49:28 UTC
(rev 823)
+++ branches/guffert/wingui/odbcdialogparams/odbcdialogparams.h	2007-10-17 21:28:57 UTC
(rev 824)
@@ -1,79 +1,34 @@
 #ifndef __ODBCPARAMS_H__
 #define __ODBCPARAMS_H__
 
-#ifdef ODBCDIALOGPARAMS_EXPORTS
+#ifdef DataSource_EXPORTS
 #define _ODBCPARAMDLL __declspec(dllexport)
 #else
 #define _ODBCPARAMDLL __declspec(dllimport)
 #endif
 
 #include "myString.h"
+#include "../util/installer.h"
 
 // procedure describes all items shown on the dialog
-struct OdbcDialogParams
-{
-	myString		drvname;
-    myString        dsname;
-	myString		drvdesc;
-	myString		srvname;
-	unsigned		port;
-	myString		username;
-	myString		password;
-	myString		dbname;
-	myString		socket;
-	myString		sslkey;
-	myString		sslcert;
-	myString		sslca;
-	myString		sslcapath;
-	myString		sslcipher;
-	myString		initstmt;
-	myString		charset;
 
-	// flags 1
-	bool dont_optimize_column_width;
-	bool return_matching_rows;
-	bool allow_big_results;
-	bool use_compressed_protocol;
-	bool change_bigint_columns_to_int;
-	bool safe;
-	bool enable_auto_reconnect;
-	bool enable_auto_increment_null_search;
-	// flags 2
-	bool dont_prompt_upon_connect;
-	bool enable_dynamic_cursor;
-	bool ignore_N_in_name_table;
-	bool user_manager_cursor;
-	bool dont_use_set_locale;
-	bool pad_char_to_full_length;
-	bool dont_cache_result;
-	// flags 3
-	bool return_table_names_for_SqlDesribeCol;
-	bool ignore_space_after_function_names;
-	bool force_use_of_named_pipes;
-	bool no_catalog;
-	bool read_options_from_mycnf;
-	bool disable_transactions;
-	bool force_use_of_forward_only_cursors;
-	// debug
-	bool save_queries;
-};
 
 // four callbacks:
 // called when [Help] pressed
 typedef void HelpButtonPressedCallbackType(HWND dialog);
 // called when [Test] pressed - show any messages to user here
-typedef const wchar_t * TestButtonPressedCallbackType(HWND dialog, OdbcDialogParams*
params);
+typedef const wchar_t * TestButtonPressedCallbackType(HWND dialog, DataSource* params);
 // called when [OK] pressed - show errors here (if any) and return false to prevent
dialog close
-typedef BOOL AcceptParamsCallbackType(HWND dialog, OdbcDialogParams* params);
+typedef BOOL AcceptParamsCallbackType(HWND dialog, DataSource* params);
 // called when DataBase combobox Drops Down
-typedef const WCHAR** DatabaseNamesCallbackType(HWND dialog, OdbcDialogParams* params);
+typedef const WCHAR** DatabaseNamesCallbackType(HWND dialog, DataSource* params);
 
 
 // exported procedure (the one) - not any more. statically linked.
 // returns TRUE if user pressed OK, FALSE - otherwise
 int /*_ODBCPARAMDLL*/ ShowOdbcParamsDialog(
     PWCHAR caption,                 /*[in] Dialog caption*/
-	OdbcDialogParams* params,                  /*[inout] params */
+	DataSource* params,                  /*[inout] params */
 	HWND ParentWnd = NULL,                     /* [in] could be NULL */
 	HelpButtonPressedCallbackType* hcallback = NULL, /* [in] could be NULL */
 	TestButtonPressedCallbackType* tcallback = NULL, /* [in] could be NULL */

Modified: branches/guffert/wingui/odbcdialogparams/odbcdialogparams.rc
===================================================================
--- branches/guffert/wingui/odbcdialogparams/odbcdialogparams.rc	2007-10-17 04:49:28 UTC
(rev 823)
+++ branches/guffert/wingui/odbcdialogparams/odbcdialogparams.rc	2007-10-17 21:28:57 UTC
(rev 824)
@@ -34,12 +34,12 @@
 FONT 8, "MS Shell Dlg", 400, 0, 0x1
 BEGIN
     GROUPBOX        "ODBC Connection Paramentes",IDC_STATIC,18,53,248,148
-    EDITTEXT        IDC_EDIT_dsname,98,69,143,14,ES_AUTOHSCROLL
-    EDITTEXT        IDC_EDIT_drvdesc,98,89,143,14,ES_AUTOHSCROLL
-    EDITTEXT        10002,98,121,85,14,ES_AUTOHSCROLL
+    EDITTEXT        IDC_EDIT_name,98,69,143,14,ES_AUTOHSCROLL
+    EDITTEXT        IDC_EDIT_description,98,89,143,14,ES_AUTOHSCROLL
+    EDITTEXT        IDC_EDIT_server,98,121,85,14,ES_AUTOHSCROLL
     EDITTEXT        IDC_EDIT_port,212,121,28,14,ES_AUTOHSCROLL | ES_NUMBER
-    EDITTEXT        IDC_EDIT_username,98,140,85,14,ES_AUTOHSCROLL
-    EDITTEXT        IDC_EDIT_password,98,158,85,14,ES_PASSWORD | ES_AUTOHSCROLL
+    EDITTEXT        IDC_EDIT_uid,98,140,85,14,ES_AUTOHSCROLL
+    EDITTEXT        IDC_EDIT_pwd,98,158,85,14,ES_PASSWORD | ES_AUTOHSCROLL
     RTEXT           "Data Source Name:",IDC_STATIC,23,72,67,8
     RTEXT           "Description:",IDC_STATIC,23,92,67,8
     RTEXT           "Server:",IDC_STATIC,23,123,67,8
@@ -54,7 +54,7 @@
     PUSHBUTTON      "&Details >>",IDC_BUTTON_DETAILS,17,376,50,14
     PUSHBUTTON      "&Help",IDC_BUTTON_HELP,217,375,49,15
     CONTROL         130,IDC_STATIC,"Static",SS_BITMAP,0,0,279,39
-    COMBOBOX        IDC_EDIT_dbname,98,176,85,42,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL |
WS_TABSTOP
+    COMBOBOX        IDC_EDIT_database,98,176,85,42,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL |
WS_TABSTOP
 END
 
 IDD_TAB1 DIALOGEX 0, 0, 209, 151

Modified: branches/guffert/wingui/odbcdialogparams/odbcdialogparams.vcproj
===================================================================
--- branches/guffert/wingui/odbcdialogparams/odbcdialogparams.vcproj	2007-10-17 04:49:28
UTC (rev 823)
+++ branches/guffert/wingui/odbcdialogparams/odbcdialogparams.vcproj	2007-10-17 21:28:57
UTC (rev 824)
@@ -40,8 +40,8 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="&quot;D:\Program Files\MySQL\MySQL Server
5.0\include&quot;"
-				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;ODBCDIALOGPARAMS_EXPORTS"
+				AdditionalIncludeDirectories="D:\mysqlclient5.0.26\include"
+				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;ODBCDIALOGPARAMS_EXPORTS;_DO_NOT_USE_STRING_"
 				MinimalRebuild="false"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="1"
@@ -62,6 +62,7 @@
 			<Tool
 				Name="VCLibrarianTool"
 				AdditionalDependencies="comctl32.lib"
+				AdditionalLibraryDirectories=""
 			/>
 			<Tool
 				Name="VCALinkTool"
@@ -105,6 +106,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
+				AdditionalIncludeDirectories="D:\mysqlclient5.0.26\include"
 				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;ODBCDIALOGPARAMS_EXPORTS"
 				RuntimeLibrary="0"
 				UsePrecompiledHeader="2"
@@ -124,6 +126,7 @@
 			<Tool
 				Name="VCLibrarianTool"
 				AdditionalDependencies="comctl32.lib"
+				AdditionalLibraryDirectories=""
 			/>
 			<Tool
 				Name="VCALinkTool"

Modified: branches/guffert/wingui/odbcdialogparams/resource.h
===================================================================
--- branches/guffert/wingui/odbcdialogparams/resource.h	2007-10-17 04:49:28 UTC (rev 823)
+++ branches/guffert/wingui/odbcdialogparams/resource.h	2007-10-17 21:28:57 UTC (rev 824)
@@ -55,13 +55,18 @@
 #define IDC_SSLCACHOOSER                1026
 #define IDC_SSLCAPATHCHOOSER            1027
 #define IDC_EDIT_drvname                10000
-#define IDC_EDIT_dsname                 10000
+#define IDC_EDIT_name                   10000
 #define IDC_EDIT_drvdesc                10001
+#define IDC_EDIT_description            10001
 #define IDC_EDIT_srvname                10002
+#define IDC_EDIT_server                 10002
 #define IDC_EDIT_port                   10003
 #define IDC_EDIT_username               10004
+#define IDC_EDIT_uid                    10004
 #define IDC_EDIT_password               10005
+#define IDC_EDIT_pwd                    10005
 #define IDC_EDIT_dbname                 10006
+#define IDC_EDIT_database               10006
 #define IDC_CHECK_dont_optimize_column_width 10007
 #define IDC_CHECK_return_matching_rows  10008
 #define IDC_CHECK_allow_big_results     10009

Modified: branches/guffert/wingui/setup/MYODBCSetupConfigDSNAdd.c
===================================================================
--- branches/guffert/wingui/setup/MYODBCSetupConfigDSNAdd.c	2007-10-17 04:49:28 UTC (rev
823)
+++ branches/guffert/wingui/setup/MYODBCSetupConfigDSNAdd.c	2007-10-17 21:28:57 UTC (rev
824)
@@ -105,13 +105,9 @@
     */    
     if ( hWnd )
     {
-        OdbcDialogParams params;
-        DS2DialogParams(*pDataSource,params);
-
-        if ( !ShowOdbcParamsDialog( L"Adding New DSN", &params, hWnd, myhelp, mytest,
mytestaccept, mygetdatabases ) )
+        if ( !ShowOdbcParamsDialog( L"Adding New DSN", pDataSource, hWnd, myhelp, mytest,
mytestaccept, mygetdatabases ) )
             return FALSE;
 
-        DialogParams2DS( params, *pDataSource );
         cleanUp();
     }
 

Modified: branches/guffert/wingui/setup/MYODBCSetupConfigDSNEdit.c
===================================================================
--- branches/guffert/wingui/setup/MYODBCSetupConfigDSNEdit.c	2007-10-17 04:49:28 UTC (rev
823)
+++ branches/guffert/wingui/setup/MYODBCSetupConfigDSNEdit.c	2007-10-17 21:28:57 UTC (rev
824)
@@ -93,13 +93,9 @@
     */
     if ( hWnd )
     {
-        OdbcDialogParams params;
-        DS2DialogParams(*pDataSource,params);
-
-        if ( !ShowOdbcParamsDialog( L"Adding New DSN", &params, hWnd, myhelp, mytest,
mytestaccept, mygetdatabases ) )
+        if ( !ShowOdbcParamsDialog( L"Adding New DSN", pDataSource, hWnd, myhelp, mytest,
mytestaccept, mygetdatabases ) )
             return FALSE;
 
-        DialogParams2DS( params, *pDataSource );
         cleanUp();
     }
 

Modified: branches/guffert/wingui/setup/myodbc3S.vcproj
===================================================================
--- branches/guffert/wingui/setup/myodbc3S.vcproj	2007-10-17 04:49:28 UTC (rev 823)
+++ branches/guffert/wingui/setup/myodbc3S.vcproj	2007-10-17 21:28:57 UTC (rev 824)
@@ -55,7 +55,7 @@
 				Optimization="0"
 				InlineFunctionExpansion="0"
 				AdditionalIncludeDirectories="&quot;D:\Qt-4.3.0\include&quot;;&quot;D:\Qt-4.3.0\include\Qt&quot;;&quot;D:\Qt-4.3.0\mkspecs\default&quot;;&quot;E:\work\!MySQL!!!\Projects\ODBC3.51\connOdbc3-pr2\branches\guffert\1&quot;;&quot;D:\Qt-4.3.0\include\QtCore&quot;;&quot;D:\Qt-4.3.0\include\QtGui&quot;;&quot;D:\Qt-4.3.0\include\Qt3Support&quot;;&quot;D:\Qt-4.3.0\include\QtAssistant&quot;;&quot;D:\Qt-4.3.0\include\QtDesigner&quot;;&quot;D:\Qt-4.3.0\include\QtNetwork&quot;;&quot;D:\Qt-4.3.0\include\QtOpenGL&quot;;&quot;D:\Qt-4.3.0\include\QtSql&quot;;&quot;D:\Qt-4.3.0\include\QtXml&quot;;&quot;D:\Qt-4.3.0\include\QtSvg&quot;;&quot;D:\Qt-4.3.0\include\QtUiTools&quot;;&quot;D:\Qt-4.3.0\include\QtTest&quot;;&quot;D:\Program
Files\MySQL\MySQL Server 5.0\include&quot;"
-				PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,MYODBC_DBG,_CRT_SECURE_NO_DEPRECATE,_CRT_NONSTDC_NO_DEPRECATE,ENGLISH,MYODBC_EXPORTS,_USERDLL,_WIN32,WIN32,_WINDOWS,__WIN__,&quot;CMAKE_INTDIR=\&quot;Debug\&quot;&quot;,myodbc3S_EXPORTS"
+				PreprocessorDefinitions="WIN32;_WINDOWS;_DEBUG;MYODBC_DBG;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;ENGLISH;MYODBC_EXPORTS;_USERDLL;_WIN32;__WIN__;&quot;CMAKE_INTDIR=\&quot;Debug\&quot;&quot;;myodbc3S_EXPORTS;_DO_NOT_USE_STRING_"
 				BasicRuntimeChecks="3"
 				SmallerTypeCheck="true"
 				RuntimeLibrary="1"

Modified: branches/guffert/wingui/util/installer.c
===================================================================
--- branches/guffert/wingui/util/installer.c	2007-10-17 04:49:28 UTC (rev 823)
+++ branches/guffert/wingui/util/installer.c	2007-10-17 21:28:57 UTC (rev 824)
@@ -190,6 +190,49 @@
 
 
 /*
+ * Lookup a driver given only the filename of the driver. This is used
+ * to support prompting for additional DSN info upon connect when the
+ * driver uses an external setup library.
+ */
+int driver_lookup_name(Driver *driver)
+{
+  SQLWCHAR drivers[1024];
+  SQLWCHAR *pdrv= drivers;
+  SQLWCHAR driverinfo[1024];
+  int len;
+  short slen; /* WORD needed for windows */
+
+  /* get list of drivers */
+#ifdef _WIN32
+  if (!SQLGetInstalledDriversW(pdrv, 1023, &slen) || !(len= slen))
+#else
+  if (!(len= SQLGetPrivateProfileStringW(NULL, NULL, W_EMPTY, pdrv,
+                                         1023, W_ODBCINST_INI)))
+#endif
+    return -1;
+
+  /* check the lib of each driver for one that matches the given lib name */
+  while (len > 0)
+  {
+    if (!SQLGetPrivateProfileStringW(pdrv, W_DRIVER, W_EMPTY, driverinfo,
+                                    1023, W_ODBCINST_INI))
+      continue;
+
+    if (!sqlwcharcasecmp(driverinfo, driver->lib))
+    {
+      sqlwcharncpy(driver->name, pdrv, ODBCDRIVER_STRLEN);
+      return 0;
+    }
+
+    len -= sqlwcharlen(pdrv) + 1;
+    pdrv += sqlwcharlen(pdrv) + 1;
+  }
+
+  return -1;
+}
+
+
+/*
  * Lookup a driver in the system. The driver name is read from the given
  * object. If greater-than zero is returned, additional information
  * can be obtained from SQLInstallerError(). A less-than zero return code
@@ -200,6 +243,12 @@
   SQLWCHAR buf[4096];
   SQLWCHAR *entries= buf;
   SQLWCHAR *dest;
+  /* if only the filename is given, we must get the driver's name */
+  if (!*driver->name && *driver->lib)
+  {
+    if (driver_lookup_name(driver))
+      return -1;
+  }
 
   /* get entries and make sure the driver exists */
   if (SQLGetPrivateProfileStringW(driver->name, NULL, W_EMPTY, buf, 4096,
@@ -368,6 +417,7 @@
   x_free(ds->database8);
   x_free(ds->socket8);
   x_free(ds->initstmt8);
+  x_free(ds->option8);
   x_free(ds->charset8);
   x_free(ds->sslkey8);
   x_free(ds->sslcert8);
@@ -385,8 +435,7 @@
  */
 int ds_set_strattr(SQLWCHAR **attr, const SQLWCHAR *val)
 {
-  if (*attr)
-    x_free(*attr);
+  x_free(*attr);
   if (val && *val)
     *attr= sqlwchardup(val, SQL_NTS);
   else
@@ -401,8 +450,7 @@
  */
 int ds_set_strnattr(SQLWCHAR **attr, const SQLWCHAR *val, size_t charcount)
 {
-  if (*attr)
-    x_free(*attr);
+  x_free(*attr);
 
   if (charcount == SQL_NTS)
     charcount= sqlwcharlen(val);
@@ -777,9 +825,20 @@
 SQLCHAR *ds_get_utf8attr(SQLWCHAR *attrw, SQLCHAR **attr8)
 {
   SQLINTEGER len= SQL_NTS;
-  if (*attr8)
-    x_free(*attr8);
+  x_free(*attr8);
   *attr8= sqlwchar_as_utf8(attrw, &len);
   return *attr8;
 }
 
+/*
+ * Assign a data source attribute from a UTF-8 string.
+ */
+int ds_setattr_from_utf8(SQLWCHAR **attr, SQLCHAR *val8)
+{
+  size_t len= strlen(val8);
+  x_free(*attr);
+  if (!(*attr= (SQLWCHAR *)my_malloc((len + 1) * sizeof(SQLWCHAR), MYF(0))))
+    return -1;
+  utf8_as_sqlwchar(*attr, len, val8, len);
+  return 0;
+}

Modified: branches/guffert/wingui/util/installer.h
===================================================================
--- branches/guffert/wingui/util/installer.h	2007-10-17 04:49:28 UTC (rev 823)
+++ branches/guffert/wingui/util/installer.h	2007-10-17 21:28:57 UTC (rev 824)
@@ -66,6 +66,7 @@
 
 Driver *driver_new();
 void driver_delete(Driver *driver);
+int driver_lookup_name(Driver *driver);
 int driver_lookup(Driver *driver);
 int driver_from_kvpair_semicolon(Driver *driver, const SQLWCHAR *attrs);
 int driver_to_kvpair_null(Driver *driver, SQLWCHAR *attrs, size_t attrslen);
@@ -99,6 +100,7 @@
   SQLCHAR *database8;
   SQLCHAR *socket8;
   SQLCHAR *initstmt8;
+  SQLCHAR *option8;
   SQLCHAR *charset8;
   SQLCHAR *sslkey8;
   SQLCHAR *sslcert8;
@@ -106,6 +108,35 @@
   SQLCHAR *sslcapath8;
   SQLCHAR *sslcipher8;
   /* A bitmask of all options carried over from MyODBC 3.51 */
+
+  // flags 1
+  bool dont_optimize_column_width;
+  bool return_matching_rows;
+  bool allow_big_results;
+  bool use_compressed_protocol;
+  bool change_bigint_columns_to_int;
+  bool safe;
+  bool enable_auto_reconnect;
+  bool enable_auto_increment_null_search;
+  // flags 2
+  bool dont_prompt_upon_connect;
+  bool enable_dynamic_cursor;
+  bool ignore_N_in_name_table;
+  bool user_manager_cursor;
+  bool dont_use_set_locale;
+  bool pad_char_to_full_length;
+  bool dont_cache_result;
+  // flags 3
+  bool return_table_names_for_SqlDesribeCol;
+  bool ignore_space_after_function_names;
+  bool force_use_of_named_pipes;
+  bool no_catalog;
+  bool read_options_from_mycnf;
+  bool disable_transactions;
+  bool force_use_of_forward_only_cursors;
+  // debug
+  bool save_queries;
+
 } DataSource;
 
 DataSource *ds_new();
@@ -119,6 +150,7 @@
 int ds_add(DataSource *ds);
 int ds_exists(SQLWCHAR *name);
 SQLCHAR *ds_get_utf8attr(SQLWCHAR *attrw, SQLCHAR **attr8);
+int ds_setattr_from_utf8(SQLWCHAR **attr, SQLCHAR *val8);
 
 #ifdef __cplusplus
 }

Modified: branches/guffert/wingui/util/stringutil.c
===================================================================
--- branches/guffert/wingui/util/stringutil.c	2007-10-17 04:49:28 UTC (rev 823)
+++ branches/guffert/wingui/util/stringutil.c	2007-10-17 21:28:57 UTC (rev 824)
@@ -552,7 +552,7 @@
  * @return The integer result of the conversion or 0 if the
  *         string could not be parsed.
  */
-ulong sqlwchartoul(const SQLWCHAR *wstr)
+unsigned long sqlwchartoul(const SQLWCHAR *wstr)
 {
   const SQLWCHAR *end= wstr + sqlwcharlen(wstr) - 1;
   SQLWCHAR c;
@@ -611,3 +611,18 @@
 }
 
 
+/*
+ * Copy up to 'n' characters (including NULL) from src to dest.
+ */
+SQLWCHAR *sqlwcharncpy(SQLWCHAR *dest, const SQLWCHAR *src, size_t n)
+{
+  if (!dest || !src)
+    return NULL;
+  while (*src && n--)
+    *dest++= *src++;
+  if (n)
+    *dest= 0;
+  else
+    *(dest - 1)= 0;
+  return dest;
+}

Modified: branches/guffert/wingui/util/stringutil.h
===================================================================
--- branches/guffert/wingui/util/stringutil.h	2007-10-17 04:49:28 UTC (rev 823)
+++ branches/guffert/wingui/util/stringutil.h	2007-10-17 21:28:57 UTC (rev 824)
@@ -90,9 +90,10 @@
 const SQLWCHAR *sqlwcharchr(const SQLWCHAR *wstr, SQLWCHAR wchr);
 size_t sqlwcharlen(const SQLWCHAR *wstr);
 SQLWCHAR *sqlwchardup(const SQLWCHAR *wstr, size_t charlen);
-ulong sqlwchartoul(const SQLWCHAR *wstr);
+unsigned long sqlwchartoul(const SQLWCHAR *wstr);
 void sqlwcharfromul(SQLWCHAR *wstr, unsigned long v);
 size_t sqlwcharncat2(SQLWCHAR *dest, const SQLWCHAR *src, size_t *n);
+SQLWCHAR *sqlwcharncpy(SQLWCHAR *dest, const SQLWCHAR *src, size_t n);
 
 
 #endif /* _STRINGUTIL_H */

Thread
Connector/ODBC 3.51 commit: r824 - in branches/guffert/wingui: dialog odbcdialogparams setup utillnovitsky17 Oct