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.
This commit is contained in:
Viktor Szakats
2010-03-01 01:34:52 +00:00
parent 8be99a1b5b
commit 422116d6e3
6 changed files with 61 additions and 20 deletions

View File

@@ -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)

View File

@@ -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 );

View File

@@ -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 ),

View File

@@ -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

View File

@@ -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

View File

@@ -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 );