Re: UNICODE support

Igor Korot <[email protected]> Sat, 26 Mar 2016 13:31:10 -0400
Newsgroups gmane.comp.db.unixodbc.devel
Message-ID <CA+FnnTwZp-3HeEvgwmN+3vw3U+pH34idNE-68JpvzgR=dswUAg@mail.gmail.com>
Hi, Nick,

On Sat, Mar 26, 2016 at 12:58 PM, Nick Gorham <[email protected]> wrote:
> On 26/03/16 15:10, Igor Korot wrote:
>>
>> Hi, (Nick),
>> Is it enough to do:
>>
>> #define UNICODE
>>
>> in order to use SQLW-types and functions?
>>
>> Or I need to define something else?
>>
>> Thank you.
>> _______________________________________________
>> unixODBC-dev mailing list
>> [email protected]
>> http://mailman.unixodbc.org/mailman/listinfo/unixodbc-dev
>
> You should just be able to use them. Whats not working?

Check the following code:

[code]
/* odbc.c

    testing unixODBC
*/
#include <stdlib.h>
#include <stdio.h>
#include <odbcinst.h>
#include <sqlext.h>

#define SQL_WCHART_CONVERT

int main(int argc,char *argv[])
{
    SQLHENV m_henv;
    SQLSMALLINT i = 1, attr_ret;
    SQLWCHAR driverDesc[1024], driverAttributes[256],
dsn[SQL_MAX_DSN_LENGTH + 1], sqlState[20],
errMsg[SQL_MAX_MESSAGE_LENGTH], dsnDescr[255];
    SWORD pcbDSN, pcbDesc;
    SQLINTEGER nativeError;
    SQLSMALLINT cbErrorMsg, descriptionLength;
    SQLUSMALLINT direction = SQL_FETCH_FIRST, direct = SQL_FETCH_FIRST;

    RETCODE ret = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HENV, &m_henv );
    if( ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO )
    {
        printf( "Error allocating handle\r\n" );
        while( ( ret = SQLGetDiagRecW( SQL_HANDLE_ENV, m_henv, i,
sqlState, &nativeError, errMsg, sizeof( errMsg ), &cbErrorMsg ) ) ==
SQL_SUCCESS )
        {
            printf( "Error is: %s\r\n", errMsg );
        }
        exit( 0 );
    }
    else
    {
        ret = SQLSetEnvAttr( m_henv, SQL_ATTR_ODBC_VERSION, (void *)
SQL_OV_ODBC3, 0 );
        if( ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO )
        {
            printf( "Error setting environment\r\n" );
            while( ( ret = SQLGetDiagRec( SQL_HANDLE_ENV, m_henv, i,
sqlState, &nativeError, errMsg, sizeof( errMsg ), &cbErrorMsg ) ) ==
SQL_SUCCESS )
            {
                printf( "Error is: %s\r\n", errMsg );
            }
            exit( 0 );
        }
        else
        {
            while( ( ret = SQLDrivers( m_henv, direction, driverDesc,
sizeof( driverDesc ) - 1, &descriptionLength, driverAttributes,
sizeof( driverAttributes ), &attr_ret ) ) == SQL_SUCCESS )
            {
                while( ( ret = SQLDataSources( m_henv, direct, dsn,
SQL_MAX_DSN_LENGTH, &pcbDSN, dsnDescr, 254, &pcbDesc ) ) ==
SQL_SUCCESS )
                {
                    printf( "Driver description is %s", driverDesc );
                    printf( "DSN description is %s", dsnDescr );
                    direct = SQL_FETCH_NEXT;
                }
                if( ret != SQL_SUCCESS && ret != SQL_NO_DATA )
                {
                    printf( "Error retrieving Data Source" );
                    while( ( ret = SQLGetDiagRec( SQL_HANDLE_ENV,
m_henv, i, sqlState, &nativeError, errMsg, sizeof( errMsg ),
&cbErrorMsg ) ) == SQL_SUCCESS )
                    {
                        printf( "Error is: %s\r\n", errMsg );
                    }
                    break;
                }
                direction = SQL_FETCH_NEXT;
            }
        }
    }
    return 0;
}
[/code]

resulted in:

[code]
igor@IgorDellGentoo ~ $ gcc -DUNICODE odbctest.cpp -o odbctest -lodbc
odbctest.cpp: In function 'int main(int, char**)':
odbctest.cpp:30:48: warning: format '%s' expects argument of type
'char*', but argument 2 has type 'SQLWCHAR* {aka short unsigned int*}'
[-Wformat=]
             printf( "Error is: %s\r\n", errMsg );
                                                ^
odbctest.cpp:42:52: warning: format '%s' expects argument of type
'char*', but argument 2 has type 'SQLWCHAR* {aka short unsigned int*}'
[-Wformat=]
                 printf( "Error is: %s\r\n", errMsg );
                                                    ^
odbctest.cpp:52:68: warning: format '%s' expects argument of type
'char*', but argument 2 has type 'SQLWCHAR* {aka short unsigned int*}'
[-Wformat=]
                     printf( "Driver description is %s", driverDesc );
                                                                    ^
odbctest.cpp:53:63: warning: format '%s' expects argument of type
'char*', but argument 2 has type 'SQLWCHAR* {aka short unsigned int*}'
[-Wformat=]
                     printf( "DSN description is %s", dsnDescr );
                                                               ^
odbctest.cpp:61:60: warning: format '%s' expects argument of type
'char*', but argument 2 has type 'SQLWCHAR* {aka short unsigned int*}'
[-Wformat=]
                         printf( "Error is: %s\r\n", errMsg );
                                                            ^
[/code]

Any idea what is going on? And how to fix it?

Thank you.

>
> --
> Nick
> _______________________________________________
> unixODBC-dev mailing list
> [email protected]
> http://mailman.unixodbc.org/mailman/listinfo/unixodbc-dev
_______________________________________________
unixODBC-dev mailing list
[email protected]
http://mailman.unixodbc.org/mailman/listinfo/unixodbc-dev