diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 47fac58a60..6df8d0cb0e 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,26 @@ past entries belonging to author(s): Viktor Szakats. */ +2010-03-01 02:33 UTC+0100 Viktor Szakats (harbour.01 syenar.hu) + * contrib/rddsql/sddsqlt3/sddsqlt3.c + + Added support to retrieve buffers in UNICODE mode. + ; Maybe needs fine tuning. F.e. we don't want to do this + for raw/binary/blob data. Pls review. + ; NOTE: Detecting real buffer size is weird. MSDN says + NULL should be passed to data pointer, but in this + case it returns error, if I pass any pointer, even + fake one, it works. Pbly I'm misreading something. + + * contrib/rddsql/sddodbc/tests/test1.prg + * contrib/rddsql/sddodbc/tests/test2.prg + + Added simpleio.ch. + + * contrib/rddsql/sddsqlt3/sddsqlt3.c + * contrib/rddsql/sddodbc/sddodbc.c + * contrib/rddsql/sddoci/sddoci.c + ! Fixed bad GPF after previous modif which limited field names + to specific length. + 2010-03-01 01:25 UTC+0100 Viktor Szakats (harbour.01 syenar.hu) * include/hbsetup.h * Bumped pcode version to 3 (mininum kept at 2) diff --git a/harbour/contrib/rddsql/sddoci/sddoci.c b/harbour/contrib/rddsql/sddoci/sddoci.c index 37c5d65d6e..0f23c1d077 100644 --- a/harbour/contrib/rddsql/sddoci/sddoci.c +++ b/harbour/contrib/rddsql/sddoci/sddoci.c @@ -194,7 +194,7 @@ static char * ocilibGetError( HB_ERRCODE * pErrCode ) } else { - szRet = hb_strdup( "HY000 Unable to get error message" ); + szRet = hb_strdup( "Unable to get error message" ); iNativeErr = 9999; } @@ -350,7 +350,8 @@ static HB_ERRCODE ocilibOpen( SQLBASEAREAP pArea ) pName = D_HB_ITEMPUTSTR( NULL, OCI_ColumnGetName( col ) ); szOurName = hb_strdup( hb_itemGetCPtr( pName ) ); hb_itemRelease( pName ); - szOurName[ MAX_FIELD_NAME ] = '\0'; + if( strlen( szOurName ) > MAX_FIELD_NAME ) + szOurName[ MAX_FIELD_NAME ] = '\0'; pFieldInfo.atomName = hb_strUpper( szOurName, ( HB_SIZE ) strlen( szOurName ) ); uiDataType = OCI_ColumnGetType( col ); diff --git a/harbour/contrib/rddsql/sddodbc/sddodbc.c b/harbour/contrib/rddsql/sddodbc/sddodbc.c index f529f32ac8..1dd083cb2c 100644 --- a/harbour/contrib/rddsql/sddodbc/sddodbc.c +++ b/harbour/contrib/rddsql/sddodbc/sddodbc.c @@ -382,7 +382,8 @@ static HB_ERRCODE odbcOpen( SQLBASEAREAP pArea ) pName = O_HB_ITEMPUTSTRLEN( NULL, ( O_HB_CHAR * ) cName, iNameLen ); szOurName = hb_strdup( hb_itemGetCPtr( pName ) ); hb_itemRelease( pName ); - szOurName[ MAX_FIELD_NAME ] = '\0'; + if( strlen( szOurName ) > MAX_FIELD_NAME ) + szOurName[ MAX_FIELD_NAME ] = '\0'; pFieldInfo.atomName = hb_strUpper( szOurName, ( HB_SIZE ) strlen( szOurName ) ); pFieldInfo.uiLen = ( HB_USHORT ) uiSize; @@ -578,14 +579,30 @@ static HB_ERRCODE odbcGoTo( SQLBASEAREAP pArea, HB_ULONG ulRecNo ) { case HB_FT_STRING: { - /* TODO: it is not clear for me, how can I get string length */ - /* TODO: UNICODE support */ + SQLSMALLINT iTargetType; + SQLPOINTER * val; - char * val = ( char * ) hb_xgrab( 1024 ); - if( SQL_SUCCEEDED( res = SQLGetData( hStmt, ui, SQL_C_CHAR, ( SQLCHAR * ) val, 1024, &iLen ) ) ) + /* TODO: it is not clear for me, how can I get string length */ + + iLen = 1024; + +#if defined( UNICODE ) && 0 + iTargetType = SQL_C_WCHAR; + iLen *= 2; +#else + iTargetType = SQL_C_CHAR; +#endif + + val = ( SQLPOINTER * ) hb_xgrab( iLen ); + if( SQL_SUCCEEDED( res = SQLGetData( hStmt, ui, iTargetType, val, iLen, &iLen ) ) ) { if( iLen > 0 ) - pItem = hb_itemPutCL( NULL, val, ( HB_SIZE ) iLen ); + { +#if defined( UNICODE ) + iLen /= 2; +#endif + pItem = O_HB_ITEMPUTSTRLEN( NULL, ( O_HB_CHAR * ) val, ( HB_SIZE ) iLen ); + } } hb_xfree( val ); break; @@ -593,7 +610,7 @@ static HB_ERRCODE odbcGoTo( SQLBASEAREAP pArea, HB_ULONG ulRecNo ) case HB_FT_INTEGER: { - long int val = 0; + long int val = 0; if( SQL_SUCCEEDED( res = SQLGetData( hStmt, ui, SQL_C_LONG, &val, sizeof( val ), &iLen ) ) ) { pItem = hb_itemPutNLLen( NULL, val, pField->uiLen ); @@ -604,7 +621,7 @@ static HB_ERRCODE odbcGoTo( SQLBASEAREAP pArea, HB_ULONG ulRecNo ) case HB_FT_LONG: if( pField->uiDec == 0 ) { - long int val = 0; + long int val = 0; if( SQL_SUCCEEDED( res = SQLGetData( hStmt, ui, SQL_C_LONG, &val, sizeof( val ), &iLen ) ) ) { pItem = hb_itemPutNLLen( NULL, val, pField->uiLen ); @@ -612,7 +629,7 @@ static HB_ERRCODE odbcGoTo( SQLBASEAREAP pArea, HB_ULONG ulRecNo ) } else { - double val = 0.0; + double val = 0.0; if( SQL_SUCCEEDED( res = SQLGetData( hStmt, ui, SQL_C_DOUBLE, &val, sizeof( val ), &iLen ) ) ) { pItem = hb_itemPutNDLen( NULL, val, pField->uiLen, pField->uiDec ); @@ -622,7 +639,7 @@ static HB_ERRCODE odbcGoTo( SQLBASEAREAP pArea, HB_ULONG ulRecNo ) case HB_FT_DOUBLE: { - double val = 0.0; + double val = 0.0; if( SQL_SUCCEEDED( res = SQLGetData( hStmt, ui, SQL_C_DOUBLE, &val, sizeof( val ), &iLen ) ) ) { pItem = hb_itemPutNDLen( NULL, val, pField->uiLen, pField->uiDec ); @@ -632,7 +649,7 @@ static HB_ERRCODE odbcGoTo( SQLBASEAREAP pArea, HB_ULONG ulRecNo ) case HB_FT_LOGICAL: { - unsigned char val = 0; + unsigned char val = 0; if( SQL_SUCCEEDED( res = SQLGetData( hStmt, ui, SQL_C_BIT, &val, sizeof( val ), &iLen ) ) ) { pItem = hb_itemPutL( NULL, val != 0 ); @@ -642,7 +659,7 @@ static HB_ERRCODE odbcGoTo( SQLBASEAREAP pArea, HB_ULONG ulRecNo ) case HB_FT_DATE: { - DATE_STRUCT val = {0,0,0}; + DATE_STRUCT val = { 0, 0, 0 }; if( SQL_SUCCEEDED( res = SQLGetData( hStmt, ui, SQL_C_DATE, &val, sizeof( val ), &iLen ) ) ) { pItem = hb_itemPutD( NULL, val.year, val.month, val.day ); @@ -652,7 +669,7 @@ static HB_ERRCODE odbcGoTo( SQLBASEAREAP pArea, HB_ULONG ulRecNo ) case HB_FT_TIME: { - TIME_STRUCT val = {0,0,0}; + TIME_STRUCT val = { 0, 0, 0 }; if( SQL_SUCCEEDED( res = SQLGetData( hStmt, ui, SQL_C_TIME, &val, sizeof( val ), &iLen ) ) ) { pItem = hb_itemPutTDT( NULL, 0, hb_timeEncode( val.hour, val.minute, val.second, 0 ) ); @@ -662,7 +679,7 @@ static HB_ERRCODE odbcGoTo( SQLBASEAREAP pArea, HB_ULONG ulRecNo ) case HB_FT_TIMESTAMP: { - TIMESTAMP_STRUCT val = {0,0,0,0,0,0,0}; + TIMESTAMP_STRUCT val = { 0, 0, 0, 0, 0, 0, 0 }; if( SQL_SUCCEEDED( res = SQLGetData( hStmt, ui, SQL_C_TIMESTAMP, &val, sizeof( val ), &iLen ) ) ) { pItem = hb_itemPutTDT( NULL, hb_dateEncode( val.year, val.month, val.day ), diff --git a/harbour/contrib/rddsql/sddodbc/tests/test1.prg b/harbour/contrib/rddsql/sddodbc/tests/test1.prg index 59d633acd6..9a4690e755 100644 --- a/harbour/contrib/rddsql/sddodbc/tests/test1.prg +++ b/harbour/contrib/rddsql/sddodbc/tests/test1.prg @@ -2,6 +2,7 @@ * $Id$ */ +#include "simpleio.ch" #include "hbrddsql.ch" REQUEST SDDODBC, SQLMIX @@ -20,4 +21,4 @@ PROC main() DBGOTOP() BROWSE() DBCLOSEAREA() -RETURN +RETURN diff --git a/harbour/contrib/rddsql/sddodbc/tests/test2.prg b/harbour/contrib/rddsql/sddodbc/tests/test2.prg index 1aa885c341..fb3d8e501a 100644 --- a/harbour/contrib/rddsql/sddodbc/tests/test2.prg +++ b/harbour/contrib/rddsql/sddodbc/tests/test2.prg @@ -2,6 +2,7 @@ * $Id$ */ +#include "simpleio.ch" #include "hbrddsql.ch" REQUEST SQLMIX, SDDODBC @@ -32,4 +33,4 @@ LOCAL nConnection, nI, aI ENDDO ? "LASTREC:", LASTREC() DBCLOSEALL() -RETURN +RETURN diff --git a/harbour/contrib/rddsql/sddsqlt3/sddsqlt3.c b/harbour/contrib/rddsql/sddsqlt3/sddsqlt3.c index 2659f15d87..0622c272fa 100644 --- a/harbour/contrib/rddsql/sddsqlt3/sddsqlt3.c +++ b/harbour/contrib/rddsql/sddsqlt3/sddsqlt3.c @@ -167,7 +167,7 @@ static char * sqlite3GetError( SQLDDCONNECTION * pConnection, HB_ERRCODE * pErrC iNativeErr = sqlite3_errcode( ( sqlite3 * ) pConnection->hConnection ); } else - szRet = hb_strdup( "HY000 Unable to get error message" ); + szRet = hb_strdup( "Unable to get error message" ); if( pErrCode ) *pErrCode = ( HB_ERRCODE ) iNativeErr; @@ -291,7 +291,8 @@ static HB_ERRCODE sqlite3Open( SQLBASEAREAP pArea ) pName = S_HB_ITEMPUTSTR( NULL, sqlite3_column_name( st, uiIndex ) ); szOurName = hb_strdup( hb_itemGetCPtr( pName ) ); hb_itemRelease( pName ); - szOurName[ MAX_FIELD_NAME ] = '\0'; + if( strlen( szOurName ) > MAX_FIELD_NAME ) + szOurName[ MAX_FIELD_NAME ] = '\0'; pFieldInfo.atomName = hb_strUpper( szOurName, ( HB_SIZE ) strlen( szOurName ) ); iDataType = sqlite3_column_type( st, uiIndex );