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:
@@ -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)
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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 ),
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 );
|
||||
|
||||
Reference in New Issue
Block a user