Modified:
MYSQLPlus/MYSQLPlusLib/MResult.cpp
MYSQLPlus/MYSQLPlusLib/MResult.h
MYSQLPlus/MYSQLPlusLib/MStatement.cpp
Log:
Modified: MYSQLPlus/MYSQLPlusLib/MResult.cpp
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MResult.cpp 2006-05-15 15:42:46 UTC (rev 239)
+++ MYSQLPlus/MYSQLPlusLib/MResult.cpp 2006-05-15 15:58:20 UTC (rev 240)
@@ -73,6 +73,219 @@
MYODBCDbgReturn3( "%d", nState );
}
+SQLRETURN MResult::getData( SQLUSMALLINT nColumnNumber, SQLSMALLINT nTargetType,
SQLPOINTER pTargetValue, SQLINTEGER nBufferLength, SQLINTEGER *pnStrLenOrInd )
+{
+ MYODBCDbgEnter();
+
+ QVariant variantData;
+ SQLRETURN nReturn = getData( nColumnNumber, &variantData );
+ if ( !SQL_SUCCEEDED(nReturn) )
+ MYODBCDbgReturn( nReturn );
+
+ SQLRETURN nReturn = getData( nColumn, variantData );
+ SQLPOINTER pdata = pDescriptorRecord->getDataPtr();
+ SQLINTEGER * pnIndicator = pDescriptorRecord->getIndicatorPtr();
+ SQLINTEGER * pnOctetLength = pDescriptorRecord->getOctetLengthPtr();
+
+ if ( getState() < STATE_EXECUTED )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+
+ if ( variantData.isNull() )
+ {
+ if ( pnIndicator )
+ {
+ *pnIndicator = SQL_NULL_DATA;
+ MYODBCDbgReturn( SQL_SUCCESS );
+ }
+ else
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_22002 ) );
+ }
+
+ if ( pnIndicator ) *pnIndicator = 0;
+
+ switch ( pDescriptorRecord->getConciseType() )
+ {
+ case SQL_C_CHAR:
+ {
+ if ( !variantData.canConvert<QString>() )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006
) );
+ QString stringData = variantData.toString();
+ MYODBCC::doStrNCpy( (SQLWCHAR*)pdata,
pDescriptorRecord->getOctetLength() / sizeof(SQLWCHAR), stringData.utf16() );
+ if ( pnOctetLength ) *pnOctetLength = stringData.length() *
sizeof(SQLWCHAR);
+ }
+ break;
+ case SQL_C_SSHORT:
+ {
+ if ( !variantData.canConvert<short int>() )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006
) );
+ *((short int*)pdata) = (short int)variantData.toInt();
+ if ( pnOctetLength ) *pnOctetLength = sizeof(short int);
+ }
+ break;
+ case SQL_C_USHORT:
+ {
+ if ( !variantData.canConvert<unsigned short int>() )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006
) );
+ *((unsigned short int*)pdata) = (unsigned short int)variantData.toUInt();
+ if ( pnOctetLength ) *pnOctetLength = sizeof(unsigned short int);
+ }
+ break;
+ case SQL_C_SLONG:
+ {
+ if ( !variantData.canConvert<long int>() )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006
) );
+ *((long int*)pdata) = (long int)variantData.toLongLong();
+ if ( pnOctetLength ) *pnOctetLength = sizeof(long int);
+ }
+ break;
+ case SQL_C_ULONG:
+ {
+ if ( !variantData.canConvert<unsigned long int>() )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006
) );
+ *((unsigned long int*)pdata) = (unsigned long
int)variantData.toULongLong();
+ if ( pnOctetLength ) *pnOctetLength = sizeof(unsigned long int);
+ }
+ break;
+ case SQL_C_FLOAT:
+ {
+ if ( !variantData.canConvert<float>() )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006
) );
+ *((float *)pdata) = (float)variantData.toDouble();
+ if ( pnOctetLength ) *pnOctetLength = sizeof(float);
+ }
+ break;
+ case SQL_C_DOUBLE:
+ {
+ if ( !variantData.canConvert<double>() )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006
) );
+ *((double *)pdata) = (double)variantData.toDouble();
+ if ( pnOctetLength ) *pnOctetLength = sizeof(double);
+ }
+ break;
+ case SQL_C_BIT:
+ {
+ if ( !variantData.canConvert<unsigned char>() )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006
) );
+ *((unsigned char *)pdata) = variantData.toInt();
+ if ( pnOctetLength ) *pnOctetLength = sizeof(unsigned char);
+ }
+ break;
+ case SQL_C_STINYINT:
+ {
+ if ( !variantData.canConvert<char>() )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006
) );
+ *((char *)pdata) = variantData.toInt();
+ if ( pnOctetLength ) *pnOctetLength = sizeof(char);
+ }
+ break;
+ case SQL_C_UTINYINT:
+ {
+ if ( !variantData.canConvert<unsigned char>() )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006
) );
+ *((unsigned char *)pdata) = variantData.toUInt();
+ if ( pnOctetLength ) *pnOctetLength = sizeof(unsigned char);
+ }
+ break;
+ case SQL_C_SBIGINT:
+ {
+ if ( !variantData.canConvert<qint64>() )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006
) );
+ *((qint64*)pdata) = (qint64)variantData.toLongLong();
+ if ( pnOctetLength ) *pnOctetLength = sizeof(qint64);
+ }
+ break;
+ case SQL_C_UBIGINT:
+ {
+ if ( !variantData.canConvert<quint64>() )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006
) );
+ *((quint64*)pdata) = (quint64)variantData.toULongLong();
+ if ( pnOctetLength ) *pnOctetLength = sizeof(quint64);
+ }
+ break;
+ case SQL_C_BINARY:
+ {
+ QByteArray bytearray = variantData.toByteArray();
+
+ MYODBCC::doMemCpy( pdata, bytearray.constData(),
pDescriptorRecord->getOctetLength() );
+ if ( pnOctetLength ) *pnOctetLength = bytearray.size();
+ }
+ break;
+ case SQL_C_TYPE_DATE:
+ {
+ SQL_DATE_STRUCT *pdate = (SQL_DATE_STRUCT *)pdata;
+
+ if ( !variantData.canConvert<QDate>() )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006
) );
+ QDate d = variantData.toDate();
+ pdate->day = d.day();
+ pdate->month = d.month();
+ pdate->year = d.year();
+ if ( pnOctetLength ) *pnOctetLength = sizeof(SQL_DATE_STRUCT);
+ }
+ break;
+ case SQL_C_TYPE_TIME:
+ {
+ SQL_TIME_STRUCT *ptime = (SQL_TIME_STRUCT *)pdata;
+
+ if ( !variantData.canConvert<QTime>() )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006
) );
+ QTime t = variantData.toTime();
+ ptime->hour = t.hour();
+ ptime->minute = t.minute();
+ ptime->second = t.second();
+ if ( pnOctetLength ) *pnOctetLength = sizeof(SQL_TIME_STRUCT);
+ }
+ break;
+ case SQL_C_TYPE_TIMESTAMP:
+ {
+ SQL_TIMESTAMP_STRUCT *p = (SQL_TIMESTAMP_STRUCT *)pdata;
+
+ if ( !variantData.canConvert<QDateTime>() )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006
) );
+ QDateTime t = variantData.toDateTime();
+ p->day = t.date().day();
+ p->fraction = t.time().msec(); /* \todo fraction is not same as
msec - look into it */
+ p->hour = t.time().hour();
+ p->minute = t.time().minute();
+ p->month = t.date().month();
+ p->second = t.time().second();
+ p->year = t.date().year();
+ if ( pnOctetLength ) *pnOctetLength = sizeof(SQL_TIMESTAMP_STRUCT);
+ }
+ break;
+ case SQL_C_NUMERIC:
+ {
+ SQL_NUMERIC_STRUCT *p = (SQL_NUMERIC_STRUCT *)pdata;
+
+ if ( !variantData.canConvert<QDateTime>() )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006
) );
+ QDateTime t = variantData.toDateTime();
+ if ( pnOctetLength ) *pnOctetLength = sizeof(SQL_NUMERIC_STRUCT);
+ }
+ break;
+ case SQL_C_GUID:
+ case SQL_C_DEFAULT:
+ case SQL_C_INTERVAL_MONTH:
+ case SQL_C_INTERVAL_YEAR:
+ case SQL_C_INTERVAL_YEAR_TO_MONTH:
+ case SQL_C_INTERVAL_DAY:
+ case SQL_C_INTERVAL_HOUR:
+ case SQL_C_INTERVAL_MINUTE:
+ case SQL_C_INTERVAL_SECOND:
+ case SQL_C_INTERVAL_DAY_TO_HOUR:
+ case SQL_C_INTERVAL_DAY_TO_MINUTE:
+ case SQL_C_INTERVAL_DAY_TO_SECOND:
+ case SQL_C_INTERVAL_HOUR_TO_MINUTE:
+ case SQL_C_INTERVAL_HOUR_TO_SECOND:
+ case SQL_C_INTERVAL_MINUTE_TO_SECOND:
+ break;
+ default:
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
tr("unsupported concise type") ) );
+ }
+
+ MYODBCDbgReturn( nReturn );
+}
+
BOOLEAN MResult::isBuffered()
{
MYODBCDbgEnter();
Modified: MYSQLPlus/MYSQLPlusLib/MResult.h
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MResult.h 2006-05-15 15:42:46 UTC (rev 239)
+++ MYSQLPlus/MYSQLPlusLib/MResult.h 2006-05-15 15:58:20 UTC (rev 240)
@@ -47,6 +47,7 @@
virtual SQLRETURN getColumns( uint *pnColumns ) = 0;
virtual SQLRETURN getData( uint nColumn, QVariant &variantData ) = 0;
+ virtual SQLRETURN getData( SQLUSMALLINT nColumnNumber, SQLSMALLINT nTargetType,
SQLPOINTER pTargetValue, SQLINTEGER nBufferLength, SQLINTEGER *pnStrLenOrInd );
virtual SQLRETURN getRow( qulonglong *pnRow ) = 0;
virtual SQLRETURN getRows( qulonglong *pnRows ) = 0;
Modified: MYSQLPlus/MYSQLPlusLib/MStatement.cpp
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MStatement.cpp 2006-05-15 15:42:46 UTC (rev 239)
+++ MYSQLPlus/MYSQLPlusLib/MStatement.cpp 2006-05-15 15:58:20 UTC (rev 240)
@@ -245,7 +245,7 @@
MYODBCDbgReturn( SQL_ERROR );
}
-SQLRETURN MStatement::getData( SQLUSMALLINT nColumnNumber, SQLSMALLINT nTargetType,
SQLPOINTER pTargetValuePtr, SQLINTEGER nBufferLength, SQLINTEGER *pnStrLenOrIndPtr )
+SQLRETURN MStatement::getData( SQLUSMALLINT nColumnNumber, SQLSMALLINT nTargetType,
SQLPOINTER pTargetValue, SQLINTEGER nBufferLength, SQLINTEGER *pnStrLenOrInd )
{
MYODBCDbgEnter();
@@ -427,14 +427,7 @@
// if ( nColumnNumber == 0 && nBufferLength < 4 && ODBCVER <
0x0300 && ODBCVER >= 0x0200 )
// MYODBCDbgReturn( pDiagnostic->doAppend( MDiagnostic::DIA_HY090 ) );
- /* do it */
- QVariant variantData;
- SQLRETURN nReturn = pResult->getData( nColumnNumber, &variantData );
-
- if ( !SQL_SUCCEEDED( nReturn ) )
- MYODBCDbgReturn( nReturn );
-
- MYODBCDbgReturn( );
+ MYODBCDbgReturn( pResult->getData( nColumnNumber, nTargetType, pTargetValue,
nBufferLength, pnStrLenOrInd ) );
}
SQLRETURN MStatement::getDiagField( SQLSMALLINT nRecNumber, SQLSMALLINT nDiagIdentifier,
SQLPOINTER pDiagInfo, SQLSMALLINT nBufferLength, SQLSMALLINT *pnStringLength )
| Thread |
|---|
| • Connector/ODBC 5 commit: r240 - MYSQLPlus/MYSQLPlusLib | pharvey | 15 May |