Only in ../myodbc/MyODBC-3.51.11/driver: catalog.lo Only in ../myodbc/MyODBC-3.51.11/driver: catalog.o diff -u ../myodbc/MyODBC-3.51.11/driver/connect.c driver/connect.c --- ../myodbc/MyODBC-3.51.11/driver/connect.c 2005-01-31 20:12:14.000000000 +0100 +++ driver/connect.c 2005-06-19 12:13:20.000000000 +0200 @@ -186,13 +186,13 @@ @purpose : to connect to mysql server */ -SQLRETURN SQL_API SQLConnect(SQLHDBC hdbc, +SQLRETURN SQL_API my_SQLConnect(SQLHDBC hdbc, SQLCHAR FAR *szDSN, SQLSMALLINT cbDSN, SQLCHAR FAR *szUID, SQLSMALLINT cbUID, SQLCHAR FAR *szAuthStr, - SQLSMALLINT cbAuthStr) + SQLSMALLINT cbAuthStr, short is_utf8) { char host[64],user[64],passwd[64],dsn[NAME_LEN+1],database[NAME_LEN+1]; char port[10],flag[10],init_stmt[256],*dsn_ptr; @@ -201,7 +201,8 @@ ulong flag_nr,client_flag; uint port_nr= 0; DBC FAR *dbc= (DBC FAR*) hdbc; - DBUG_ENTER("SQLConnect"); + DBUG_ENTER("my_SQLConnect"); + if (dbc->mysql.net.vio != 0) DBUG_RETURN(set_conn_error(hdbc,MYERR_08002,NULL,0)); @@ -254,6 +255,11 @@ #endif client_flag= get_client_flag(&dbc->mysql,flag_nr,(uint) dbc->login_timeout, init_stmt); + if (is_utf8) + { + mysql_options(&dbc->mysql, MYSQL_SET_CHARSET_NAME, "utf8"); + dbc->unicode= 1; + } copy_if_not_empty(passwd,sizeof(passwd), (char FAR*) szAuthStr,cbAuthStr); copy_if_not_empty(user, sizeof(user), (char FAR *) szUID, cbUID); @@ -285,6 +291,19 @@ } +SQLRETURN SQL_API SQLConnect(SQLHDBC hdbc, + SQLCHAR FAR *szDSN, + SQLSMALLINT cbDSN, + SQLCHAR FAR *szUID, + SQLSMALLINT cbUID, + SQLCHAR FAR *szAuthStr, + SQLSMALLINT cbAuthStr) +{ + return my_SQLConnect(hdbc, szDSN, cbDSN, szUID, cbUID, + szAuthStr, cbAuthStr, 0); +} + + /* @type : myodbc3 internal @purpose : this function as its "normal" behavior is supposed to @@ -326,7 +345,7 @@ /* */ -SQLRETURN my_SQLDriverConnectTry( DBC *dbc, MYODBCUTIL_DATASOURCE *pDataSource ) +SQLRETURN my_SQLDriverConnectTry( DBC *dbc, MYODBCUTIL_DATASOURCE *pDataSource, short is_utf8 ) { ulong nFlag = 0; @@ -334,6 +353,11 @@ pDataSource->pszOPTION ? atoi(pDataSource->pszOPTION) : 0, (uint)dbc->login_timeout, pDataSource->pszSTMT ? pDataSource->pszSTMT : "" ); + if (is_utf8) + { + mysql_options(&dbc->mysql, MYSQL_SET_CHARSET_NAME, "utf8"); + dbc->unicode= 1; + } if ( !mysql_real_connect( &dbc->mysql, pDataSource->pszSERVER, @@ -369,7 +393,8 @@ SQLCHAR FAR *szConnStrOut, SQLSMALLINT cbConnStrOutMax, SQLSMALLINT FAR *pcbConnStrOut, - SQLUSMALLINT fDriverCompletion) + SQLUSMALLINT fDriverCompletion, + short is_utf8) { #ifdef PORTABLE_GUI MYODBCUTIL_DATASOURCE * pDataSource = MYODBCUtilAllocDataSource( MYODBCUTIL_DATASOURCE_MODE_DRIVER_CONNECT ); @@ -479,14 +504,14 @@ case SQL_DRIVER_COMPLETE: pDataSource->nPrompt = MYODBCUTIL_DATASOURCE_PROMPT_COMPLETE; - if ( my_SQLDriverConnectTry( dbc, pDataSource ) == SQL_SUCCESS ) + if ( my_SQLDriverConnectTry( dbc, pDataSource, is_utf8) == SQL_SUCCESS ) goto exitDriverConnect1; bPrompt = TRUE; break; case SQL_DRIVER_COMPLETE_REQUIRED: pDataSource->nPrompt = MYODBCUTIL_DATASOURCE_PROMPT_REQUIRED; - if ( my_SQLDriverConnectTry( dbc, pDataSource ) == SQL_SUCCESS ) + if ( my_SQLDriverConnectTry( dbc, pDataSource, is_utf8) == SQL_SUCCESS ) goto exitDriverConnect1; bPrompt = TRUE; break; @@ -597,7 +622,7 @@ } } - if ( my_SQLDriverConnectTry( dbc, pDataSource ) != SQL_SUCCESS ) + if ( my_SQLDriverConnectTry( dbc, pDataSource, is_utf8 ) != SQL_SUCCESS ) { nReturn = SQL_ERROR; goto exitDriverConnect0; @@ -946,7 +971,12 @@ } client_flag= get_client_flag(&dbc->mysql,dbc->flag,(uint) dbc->login_timeout, KEY_STMT); - + if (is_utf8) + { + mysql_options(&dbc->mysql, MYSQL_SET_CHARSET_NAME, "utf8"); + dbc->unicode= 1; + } + if (!mysql_real_connect(&dbc->mysql, KEY_SERVER, KEY_USER, @@ -1145,7 +1175,7 @@ { return my_SQLDriverConnect(hdbc,hwnd,szConnStrIn,cbConnStrIn, szConnStrOut,cbConnStrOutMax, - pcbConnStrOut,fDriverCompletion); + pcbConnStrOut,fDriverCompletion, 0); } diff -u ../myodbc/MyODBC-3.51.11/driver/myodbc3.h driver/myodbc3.h --- ../myodbc/MyODBC-3.51.11/driver/myodbc3.h 2005-01-28 23:05:17.000000000 +0100 +++ driver/myodbc3.h 2005-06-19 13:57:13.000000000 +0200 @@ -68,6 +68,7 @@ #include #include + #if MYSQL_VERSION_ID < MIN_MYSQL_VERSION error "MyODBC need a newer version of the MYSQL client library to compile" #endif @@ -96,6 +97,7 @@ #include #endif + #ifdef _UNIX_ /* @@ -117,6 +119,8 @@ # endif #else + + int _myodbc_SQLGetPrivateProfileString(char *section, char *entry, char *def_value, char *buf, int buf_len, char *filename); @@ -274,6 +278,7 @@ #ifdef THREAD pthread_mutex_t lock; #endif + char unicode; } DBC; @@ -403,6 +408,8 @@ */ IMPDESC ird,ard; IMPDESC ipd,apd; + + char is_result_utf8; } STMT; diff -u ../myodbc/MyODBC-3.51.11/driver/myutil.h driver/myutil.h --- ../myodbc/MyODBC-3.51.11/driver/myutil.h 2005-01-28 23:05:17.000000000 +0100 +++ driver/myutil.h 2005-06-21 11:39:27.000000000 +0200 @@ -63,6 +63,7 @@ #define DBUG_RETURN_STATUS(STATUS) \ { \ SQLRETURN rc= (STATUS); \ + printf("[%s:%d return[%d]]\n", __FILE__, __LINE__, rc);\ DBUG_PRINT("exit", ("%s", dbug_res_type(rc))); \ DBUG_RETURN(rc); \ } @@ -156,7 +157,8 @@ SQLCHAR FAR *szConnStrOut, SQLSMALLINT cbConnStrOutMax, SQLSMALLINT FAR *pcbConnStrOut, - SQLUSMALLINT fDriverCompletion); + SQLUSMALLINT fDriverCompletion, + short is_utf8); char *extend_buffer(NET *net,char *to,ulong length); void myodbc_end(); my_bool set_dynamic_result(STMT FAR *stmt); @@ -186,4 +188,6 @@ #define cmp_database(A,B) strcmp((A),(B)) #endif +#include "ConvertUTF.h" + #endif /* __MYUTIL_H__ */ diff -u ../myodbc/MyODBC-3.51.11/driver/prepare.c driver/prepare.c --- ../myodbc/MyODBC-3.51.11/driver/prepare.c 2005-01-28 23:05:17.000000000 +0100 +++ driver/prepare.c 2005-06-20 13:55:45.000000000 +0200 @@ -85,7 +85,22 @@ SQLFreeStmt(hstmt,SQL_UNBIND); /* Not needed according to VB 5.0 */ #endif - if (!(stmt->query= dupp_str((char*) szSqlStr, cbSqlStr))) + if (stmt->is_result_utf8) + { + UTF8 *u8_query; + unsigned int u16_buf_len; + MY_ConversionResult res= my_conversionOK; + + u16_buf_len= my_u16_buflen((UTF16 *)szSqlStr, cbSqlStr); + + /* the conversion function allocates memory for the buffer */ + wprintf(L"Preparing query:[%ls]\n", U16S(szSqlStr, cbSqlStr)); + res= my_ConvertUTF16toUTF8((SQLWCHAR *)szSqlStr, u16_buf_len, &u8_query, &cbSqlStr, NULL); + if (res) + DBUG_RETURN(set_error(stmt,MYERR_S1001,NULL,4001)); + + stmt->query= u8_query; + } else if (!(stmt->query= dupp_str((char*) szSqlStr, cbSqlStr))) DBUG_RETURN(set_error(stmt,MYERR_S1001,NULL,4001)); DBUG_PRINT("enter",("%s",stmt->query)); @@ -97,7 +112,7 @@ if (use_mb(charset_info)) end= strend(stmt->query); #endif - + for (pos= stmt->query; *pos ; pos++) { #ifdef USE_MB diff -u ../myodbc/MyODBC-3.51.11/driver/utility.c driver/utility.c --- ../myodbc/MyODBC-3.51.11/driver/utility.c 2005-01-28 23:05:17.000000000 +0100 +++ driver/utility.c 2005-06-20 19:55:33.000000000 +0200 @@ -238,11 +238,32 @@ { char *dst= (char*) rgbValue; ulong length; + char *pp= NULL; SQLINTEGER arg_length; - + DBUG_ENTER("copy_lresult"); + if (src && src_length == SQL_NTS) src_length= strlen(src); + if (HandleType == SQL_HANDLE_STMT && ((STMT FAR*)Handle)->is_result_utf8 + && *offset == (ulong) ~0L) + { + ConversionResult res; + uint u16_buf_len; + if (u8_to_u16_length((UTF8 *)src, ((UTF8*)src) + src_length, &u16_buf_len)) + DBUG_RETURN_STATUS(SQL_ERROR); + + pp= my_malloc(u16_buf_len + 1, MYF(MY_ZEROFILL)); + + wprintf(L"Text_data=[%ls]\n", U8S(src, my_utf8_strlen(src, src_length))); + if (res= my_ConvertUTF8toUTF16((UTF8 *)src, src_length, (SQLWCHAR **)&pp, NULL, NULL, + my_utf8_strlen(src, src_length))) + DBUG_RETURN_STATUS(SQL_ERROR); + src= pp; + src_length= u16_buf_len*sizeof(UTF16); +// binary_data= 0; + } + arg_length= cbValueMax; if (cbValueMax && !binary_data) /* If not length check */ cbValueMax--; /* Room for end null */ @@ -283,14 +304,20 @@ { ulong copy_length= ((long) src_length >= (long) length ? length : ((long) src_length >= 0 ? src_length : 0L)); + memcpy(dst,src,copy_length); + /* this padding is not UTF16 safe*/ bfill(dst+copy_length,length-copy_length,' '); if (!binary_data || length != (ulong) cbValueMax) dst[length]= 0; } +// if (pp) +// my_free((gptr) pp, MYF(0)); + if (arg_length && cbValueMax >= fill_length) return SQL_SUCCESS; - DBUG_PRINT("info",("Returned %ld characters from offset: %lu", + + DBUG_PRINT("info",("Returned %ld characters (bytes) from offset: %lu", length,*offset - length)); set_handle_error(HandleType,Handle,MYERR_01004,NULL,0); return SQL_SUCCESS_WITH_INFO;