Modified:
MYSQLPlus/MYSQLPlusLib/MResult.cpp
MYSQLPlus/MYSQLPlusLib/MResult.h
Log:
Modified: MYSQLPlus/MYSQLPlusLib/MResult.cpp
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MResult.cpp 2006-05-16 14:11:07 UTC (rev 243)
+++ MYSQLPlus/MYSQLPlusLib/MResult.cpp 2006-05-16 14:51:07 UTC (rev 244)
@@ -73,6 +73,7 @@
MYODBCDbgReturn3( "%d", nState );
}
+
/*!
\internal
\brief
@@ -132,10 +133,44 @@
*/
case SQL_ARD_TYPE:
{
+ /*!
+ \internal ODBC RULE
+
+ The TargetType argument was SQL_ARD_TYPE, and the value in the
SQL_DESC_COUNT
+ field of the ARD was less than the ColumnNumber argument.
+ */
if ( nColumnNumber > getAppRowDesc()->getCount() )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07009
) );
+
+ MDescriptorRecord *pDescriptorRecordARD = getAppRowDesc()->getRecord(
nColumnNumber );
+
+ /*!
+ \internal ODBC RULE (I think)
+
+ Examples in the spec. (not the spec. itself) shows SQL_ARD_TYPE being
used during
+ a SQLGetData() to tell the driver to use not just the concise type
but also the
+ precision and scale. Specifying the precision and scale in this way
adjusts the
+ behaviour of SQLGetData when SQL_C_NUMERIC (SQL_NUMERIC_STRUCT) is
the type as the
+ app can not use the numeric struct fields to do this ("they are
output only").
+
+ \note
+
+ IMHO this is like climbing out of the window having painted self into
a corner.
+
+ \sa
+
+ http://support.microsoft.com/default.aspx?scid=kb;en-us;222831
+ */
+ if ( pDescriptorRecordARD->getConciseType() == SQL_C_NUMERIC )
{
+ SQL_NUMERIC_STRUCT *pNumeric = (SQL_NUMERIC_STRUCT *)pTargetValue;
+
+ pNumeric->precision = pDescriptorRecordARD->getPrecision();
+ pNumeric->scale = pDescriptorRecordARD->getScale();
+
+ MYODBCDbgReturn( getData( variantData, pNumeric, pnLength ) );
}
- MDescriptorRecord *pDescriptorRecordARD = getAppRowDesc()->getRecord(
nColumnNumber );
+
MYODBCDbgReturn( getData( nColumnNumber,
pDescriptorRecordARD->getConciseType(), pTargetValue, nBufferLength, pnLength,
pnIndicator, pDescriptorRecord ) );
}
break;
@@ -148,10 +183,11 @@
*/
case SQL_C_DEFAULT:
{
+ MDescriptorRecordIRD *pDescriptorRecord = getImpRowDesc()->getRecord(
nColumnNumber );
+ MYODBCDbgReturn( getData( SQLUSMALLINT nColumnNumber,
MDescriptorRecordIRD *pDescriptorRecord, SQLPOINTER pTargetValue, SQLINTEGER
nBufferLength, SQLINTEGER *pnLength, SQLINTEGER *pnIndicator ) );
}
+ break;
- MYODBCDbgReturn( getData( SQLUSMALLINT nColumnNumber, SQLSMALLINT
nTargetType, SQLPOINTER pTargetValue, SQLINTEGER nBufferLength, SQLINTEGER *pnLength,
SQLINTEGER *pnIndicator ) );
-
case SQL_C_CHAR:
MYODBCDbgReturn( getData( variantData, (SQLWCHAR *)pTargetValue,
nBufferLength * sizeof(SQLWCHAR), SQLINTEGER pnLength ) );
@@ -202,6 +238,7 @@
case SQL_C_NUMERIC:
{
+ /* see also SQL_ARD_TYPE */
SQL_NUMERIC_STRUCT *pNumeric = (SQL_NUMERIC_STRUCT *)pTargetValue;
pNumeric->precision = 10; /* default precision */
@@ -226,37 +263,12 @@
case SQL_C_INTERVAL_HOUR_TO_SECOND:
case SQL_C_INTERVAL_MINUTE_TO_SECOND:
default:
- MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
tr("unsupported concise type") ) );
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY003 ) );
}
MYODBCDbgReturn( nReturn );
}
-/*!
- \brief This gets column data from the drivers row buffers.
-
- \param nColumn The column we are dealing with.
- \param pDescriptorRecord This is a bound ARD.
-
- \return SQLRETURN
-
- \sa getData
-*/
-SQLRETURN MResult::getData( SQLUSMALLINT nColumn, MDescriptorRecord *pDescriptorRecord )
-{
- MYODBCDbgEnter();
-
- Q_ASSERT( !pDescriptorRecord );
-
- MYODBCDbgReturn( getData( nColumn,
- pDescriptorRecord->getConciseType(),
- pDescriptorRecord->getDataPtr(),
- pDescriptorRecord->getOctetLength(),
- pDescriptorRecord->getOctetLengthPtr(),
- pDescriptorRecord->getIndicatorPtr(),
- pDescriptorRecord ) );
-}
-
BOOLEAN MResult::isBuffered()
{
MYODBCDbgEnter();
@@ -346,11 +358,92 @@
MYODBCDbgReturn3( "%p", getStatement()->getImpRowDesc() );
}
+/*!
+ \brief This gets column data from the drivers row buffers.
-SQLRETURN getData( const QVariant &variantData, SQLWCHAR *psTarget, SQLINTEGER
nCharsMax, SQLINTEGER *nCharsAvailable )
+ \param nColumn The column we are dealing with.
+ \param pDescriptorRecord This is a bound ARD.
+
+ \return SQLRETURN
+
+ \sa getData
+*/
+SQLRETURN MResult::getData( SQLUSMALLINT nColumn, MDescriptorRecord *pDescriptorRecord )
{
MYODBCDbgEnter();
+ Q_ASSERT( !pDescriptorRecord );
+
+ MYODBCDbgReturn( getData( nColumn,
+ pDescriptorRecord->getConciseType(),
+ pDescriptorRecord->getDataPtr(),
+ pDescriptorRecord->getOctetLength(),
+ pDescriptorRecord->getOctetLengthPtr(),
+ pDescriptorRecord->getIndicatorPtr(),
+ pDescriptorRecord ) );
+}
+
+SQLRETURN MResult::getData( SQLUSMALLINT nColumn, MDescriptorRecordIRD
*pDescriptorRecord, SQLPOINTER pTargetValue, SQLINTEGER nBufferLength, SQLINTEGER
*pnLength, SQLINTEGER *pnIndicator )
+{
+ MYODBCDbgEnter();
+
+ /*!
+ \internal
+
+ \note
+
+ We do not rely on SQL_C_* values synching up with SQL_* values.
+ */
+ switch ( pDescriptorRecord->getType() )
+ {
+ case SQL_CHAR:
+ case SQL_VARCHAR:
+ case SQL_LONGVARCHAR:
+ case SQL_WCHAR:
+ case SQL_WVARCHAR:
+ case SQL_WLONGVARCHAR:
+ /*!
+ \internal
+ \todo
+
+ Differentiate between char and wide-char.
+ */
+ MYODBCDbgReturn( getData( nColumn, SQL_C_CHAR, pTargetValue, nBufferLength,
pnLength, pnIndicator ) );
+
+ case SQL_DECIMAL:
+ case SQL_NUMERIC:
+ MYODBCDbgReturn( getData( nColumn, SQL_C_NUMERIC, pTargetValue,
nBufferLength, pnLength, pnIndicator ) );
+
+ case SQL_SMALLINT:
+ case SQL_INTEGER:
+ case SQL_REAL:
+ case SQL_FLOAT:
+ case SQL_DOUBLE:
+ case SQL_BIT:
+ case SQL_TINYINT:
+ case SQL_BIGINT:
+
+ case SQL_BINARY:
+ case SQL_VARBINARY:
+ case SQL_LONGVARBINARY:
+ MYODBCDbgReturn( getData( nColumn, SQL_C_BINARY, pTargetValue, nBufferLength,
pnLength, pnIndicator ) );
+
+ case SQL_DATETIME:
+ MYODBCDbgReturn( getData( nColumn, SQL_C_TIMESTAMP, pTargetValue,
nBufferLength, pnLength, pnIndicator ) );
+
+ case SQL_INTERVAL:
+ case SQL_GUID:
+
+ default:
+ }
+
+ MYODBCDbgReturn( SQL_SUCCESS );
+}
+
+SQLRETURN MResult::getData( const QVariant &variantData, SQLWCHAR *psTarget,
SQLINTEGER nCharsMax, SQLINTEGER *nCharsAvailable )
+{
+ MYODBCDbgEnter();
+
if ( !variantData.canConvert<QString>() )
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006 ) );
QString stringData = variantData.toString();
@@ -360,7 +453,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN getData( const QVariant &variantData, short int *pnTarget, SQLINTEGER
*pnLength );
+SQLRETURN MResult::getData( const QVariant &variantData, short int *pnTarget,
SQLINTEGER *pnLength );
{
MYODBCDbgEnter();
@@ -372,7 +465,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN getData( const QVariant &variantData, unsigned short int *pnTarget,
SQLINTEGER *pnLength );
+SQLRETURN MResult::getData( const QVariant &variantData, unsigned short int
*pnTarget, SQLINTEGER *pnLength );
{
MYODBCDbgEnter();
@@ -384,7 +477,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN getData( const QVariant &variantData, long int *pnTarget, SQLINTEGER
*pnLength );
+SQLRETURN MResult::getData( const QVariant &variantData, long int *pnTarget,
SQLINTEGER *pnLength );
{
MYODBCDbgEnter();
@@ -396,7 +489,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN getData( const QVariant &variantData, unsigned long int *pnTarget,
SQLINTEGER *pnLength );
+SQLRETURN MResult::getData( const QVariant &variantData, unsigned long int *pnTarget,
SQLINTEGER *pnLength );
{
MYODBCDbgEnter();
@@ -408,7 +501,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN getData( const QVariant &variantData, float *pnTarget, SQLINTEGER *pnLength
);
+SQLRETURN MResult::getData( const QVariant &variantData, float *pnTarget, SQLINTEGER
*pnLength );
{
MYODBCDbgEnter();
@@ -420,7 +513,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN getData( const QVariant &variantData, double *pnTarget, SQLINTEGER
*pnLength );
+SQLRETURN MResult::getData( const QVariant &variantData, double *pnTarget, SQLINTEGER
*pnLength );
{
MYODBCDbgEnter();
@@ -432,7 +525,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN getData( const QVariant &variantData, char *pnTarget, SQLINTEGER *pnLength
);
+SQLRETURN MResult::getData( const QVariant &variantData, char *pnTarget, SQLINTEGER
*pnLength );
{
MYODBCDbgEnter();
@@ -444,7 +537,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN getData( const QVariant &variantData, unsigned char *pnTarget, SQLINTEGER
*pnLength );
+SQLRETURN MResult::getData( const QVariant &variantData, unsigned char *pnTarget,
SQLINTEGER *pnLength );
{
MYODBCDbgEnter();
@@ -456,7 +549,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN getData( const QVariant &variantData, qint64 *pnTarget, SQLINTEGER
*pnLength );
+SQLRETURN MResult::getData( const QVariant &variantData, qint64 *pnTarget, SQLINTEGER
*pnLength );
{
MYODBCDbgEnter();
@@ -468,7 +561,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN getData( const QVariant &variantData, quint64 *pnTarget, SQLINTEGER
*pnLength );
+SQLRETURN MResult::getData( const QVariant &variantData, quint64 *pnTarget,
SQLINTEGER *pnLength );
{
MYODBCDbgEnter();
@@ -480,7 +573,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN getData( const QVariant &variantData, SQLPOINTER pTarget, SQLINTEGER
nBytesMax, SQLINTEGER *pnBytesAvailable );
+SQLRETURN MResult::getData( const QVariant &variantData, SQLPOINTER pTarget,
SQLINTEGER nBytesMax, SQLINTEGER *pnBytesAvailable );
{
MYODBCDbgEnter();
@@ -492,7 +585,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN getData( const QVariant &variantData, SQL_DATE_STRUCT *pTarget, SQLINTEGER
*pnLength );
+SQLRETURN MResult::getData( const QVariant &variantData, SQL_DATE_STRUCT *pTarget,
SQLINTEGER *pnLength );
{
MYODBCDbgEnter();
@@ -507,7 +600,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN getData( const QVariant &variantData, SQL_TIME_STRUCT *pTarget, SQLINTEGER
*pnLength );
+SQLRETURN MResult::getData( const QVariant &variantData, SQL_TIME_STRUCT *pTarget,
SQLINTEGER *pnLength );
{
MYODBCDbgEnter();
@@ -522,7 +615,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN getData( const QVariant &variantData, SQL_TIMESTAMP_STRUCT *pTarget,
SQLINTEGER *pnLength );
+SQLRETURN MResult::getData( const QVariant &variantData, SQL_TIMESTAMP_STRUCT
*pTarget, SQLINTEGER *pnLength );
{
MYODBCDbgEnter();
@@ -541,7 +634,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN getData( const QVariant &variantData, SQL_NUMERIC_STRUCT *pTarget,
SQLINTEGER *pnLength );
+SQLRETURN MResult::getData( const QVariant &variantData, SQL_NUMERIC_STRUCT *pTarget,
SQLINTEGER *pnLength );
{
MYODBCDbgEnter();
Modified: MYSQLPlus/MYSQLPlusLib/MResult.h
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MResult.h 2006-05-16 14:11:07 UTC (rev 243)
+++ MYSQLPlus/MYSQLPlusLib/MResult.h 2006-05-16 14:51:07 UTC (rev 244)
@@ -86,7 +86,8 @@
MDescriptor * getImpParamDesc();
MDescriptor * getImpRowDesc();
- SQLRETURN getData( SQLUSMALLINT nColumn, MDescriptorRecord *pDescriptorRecord
); /* MDescriptorRecord needs to be a MDescriptorRecordARD or MDescriptorRecordAPD */
+ SQLRETURN getData( SQLUSMALLINT nColumn, MDescriptorRecord *pDescriptorRecord
); /* MDescriptorRecord needs to be a MDescriptorRecordARD or MDescriptorRecordAPD as
this is to support bound cols/params */
+ SQLRETURN getData( SQLUSMALLINT nColumn, MDescriptorRecordIRD
*pDescriptorRecord, SQLPOINTER pTargetValue, SQLINTEGER nBufferLength, SQLINTEGER
*pnLength, SQLINTEGER *pnIndicator ); /* supports SQL_C_DEFAULT */
SQLRETURN getData( const QVariant &variantData, SQLWCHAR *psTarget,
SQLINTEGER nCharsMax, SQLINTEGER *nCharsAvailable );
SQLRETURN getData( const QVariant &variantData, short int *pnTarget,
SQLINTEGER *pnLength );
| Thread |
|---|
| • Connector/ODBC 5 commit: r244 - MYSQLPlus/MYSQLPlusLib | pharvey | 16 May |