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-16 18:42:41 UTC (rev 246)
+++ MYSQLPlus/MYSQLPlusLib/MResult.cpp 2006-05-16 20:55:09 UTC (rev 247)
@@ -78,15 +78,18 @@
\internal
\brief Gets a columns data from the current row in the result set.
- This method has been created to implement most (if not all) of
SQLGetData() functionality. In
- fact; it takes all the same/similar arguments and returns the same
return values/states.
+ The primary purpose of this method is to support
MStatement::getData() which, in turn, can be used
+ to support SQLGetData().
+ This means that we are getting data defined by SQL type to a C buffer
defined by C type. Data conversion
+ will take place as needed and in accordance with the ODBC
specification.
+
\param nColumnNumber The desired column number as per SQLGetData().
\param nTargetType The desired C data type for pTargetValue as per SQLGetData().
\param pTargetValue A viable buffer where we can put the column value as per
SQLGetData().
\param nBufferLength The size of the buffer at pTargetValue as per SQLGetData().
- \param pnLength The number of bytes available in column as per SQLGetData().
- \param pnIndicator A buffer to be used to indicate whether or not the column is
NULL as per SQLGetData().
+ \param pnLength The number of bytes or chars available in column as per
StrLenInd of SQLGetData().
+ \param pnIndicator A buffer to be used to indicate whether or not the column is
NULL as per StrLenInd of SQLGetData().
\return SQLRETURN
@@ -118,6 +121,10 @@
if ( pnIndicator ) *pnIndicator = 0;
+ /* validate column number */
+ if ( nColumnNumber > getImpRowDesc()->getCount() )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07009 ) );
+
/* get data and data length, convert data as needed */
switch ( nTargetType )
{
@@ -138,8 +145,6 @@
if ( nColumnNumber > getAppRowDesc()->getCount() )
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07009
) );
- MDescriptorRecord *pDescriptorRecordARD = getAppRowDesc()->getRecord(
nColumnNumber );
-
/*!
\internal ODBC RULE (I think)
@@ -157,6 +162,8 @@
http://support.microsoft.com/default.aspx?scid=kb;en-us;222831
*/
+ MDescriptorRecord *pDescriptorRecordARD = getAppRowDesc()->getRecord(
nColumnNumber );
+
if ( pDescriptorRecordARD->getConciseType() == SQL_C_NUMERIC )
{
/*!
@@ -178,7 +185,8 @@
MYODBCDbgReturn( getData( variantData, pNumeric, pnLength ) );
}
- MYODBCDbgReturn( getData( nColumnNumber,
pDescriptorRecordARD->getConciseType(), pTargetValue, nBufferLength, pnLength,
pnIndicator, pDescriptorRecord ) );
+ /* try again - call ourself with the type */
+ MYODBCDbgReturn( getData( nColumnNumber,
pDescriptorRecordARD->getConciseType(), pTargetValue, nBufferLength, pnLength,
pnIndicator ) );
}
break;
@@ -187,13 +195,13 @@
If it is SQL_C_DEFAULT, the driver selects the default C data type based on
the SQL
data type of the source.
+
+ \note
+
+ The logic for selecting the C data type is spelled out in the ODBC
specification.
*/
case SQL_C_DEFAULT:
- {
- MDescriptorRecordIRD *pDescriptorRecord = getImpRowDesc()->getRecord(
nColumnNumber );
- MYODBCDbgReturn( getData( SQLUSMALLINT nColumnNumber, pDescriptorRecord,
SQLPOINTER pTargetValue, SQLINTEGER nBufferLength, SQLINTEGER *pnLength, SQLINTEGER
*pnIndicator ) );
- }
- break;
+ MYODBCDbgReturn( getData( nColumnNumber,
(MDescriptorRecordIRD*)getImpRowDesc()->getRecord( nColumnNumber ), pTargetValue,
nBufferLength, pnLength, pnIndicator ) );
case SQL_C_CHAR:
case SQL_C_WCHAR:
@@ -203,52 +211,52 @@
Differentiate between char and wide-char.
*/
- MYODBCDbgReturn( getData( variantData, (SQLWCHAR *)pTargetValue,
nBufferLength * sizeof(SQLWCHAR), SQLINTEGER pnLength ) );
+ MYODBCDbgReturn( getData( getImpRowDesc()->getConciseType(), variantData,
(SQLWCHAR *)pTargetValue, nBufferLength * sizeof(SQLWCHAR), SQLINTEGER pnLength ) );
case SQL_C_SSHORT:
- MYODBCDbgReturn( getData( variantData, (short int *)pTargetValue, pnLength )
);
+ MYODBCDbgReturn( getData( getImpRowDesc()->getConciseType(), variantData,
(short int *)pTargetValue, pnLength ) );
case SQL_C_USHORT:
- MYODBCDbgReturn( getData( variantData, (unsigned short int *)pTargetValue,
pnLength ) );
+ MYODBCDbgReturn( getData( getImpRowDesc()->getConciseType(), variantData,
(unsigned short int *)pTargetValue, pnLength ) );
case SQL_C_SLONG:
- MYODBCDbgReturn( getData( variantData, (long int *)pTargetValue, pnLength )
);
+ MYODBCDbgReturn( getData( getImpRowDesc()->getConciseType(), variantData,
(long int *)pTargetValue, pnLength ) );
case SQL_C_ULONG:
- MYODBCDbgReturn( getData( variantData, (unsigned long int *)pTargetValue,
pnLength ) );
+ MYODBCDbgReturn( getData( getImpRowDesc()->getConciseType(), variantData,
(unsigned long int *)pTargetValue, pnLength ) );
case SQL_C_FLOAT:
- MYODBCDbgReturn( getData( variantData, (float *)pTargetValue, pnLength ) );
+ MYODBCDbgReturn( getData( getImpRowDesc()->getConciseType(), variantData,
(float *)pTargetValue, pnLength ) );
case SQL_C_DOUBLE:
- MYODBCDbgReturn( getData( variantData, (double *)pTargetValue, pnLength ) );
+ MYODBCDbgReturn( getData( getImpRowDesc()->getConciseType(), variantData,
(double *)pTargetValue, pnLength ) );
case SQL_C_BIT:
- MYODBCDbgReturn( getData( variantData, (unsigned char *)pTargetValue,
pnLength ) );
+ MYODBCDbgReturn( getData( getImpRowDesc()->getConciseType(), variantData,
(unsigned char *)pTargetValue, pnLength ) );
case SQL_C_STINYINT:
- MYODBCDbgReturn( getData( variantData, (char *)pTargetValue, pnLength ) );
+ MYODBCDbgReturn( getData( getImpRowDesc()->getConciseType(), variantData,
(char *)pTargetValue, pnLength ) );
case SQL_C_UTINYINT:
- MYODBCDbgReturn( getData( variantData, (unsigned char *)pTargetValue,
pnLength ) );
+ MYODBCDbgReturn( getData( getImpRowDesc()->getConciseType(), variantData,
(unsigned char *)pTargetValue, pnLength ) );
case SQL_C_SBIGINT:
- MYODBCDbgReturn( getData( variantData, (qint64 *)pTargetValue, pnLength ) );
+ MYODBCDbgReturn( getData( getImpRowDesc()->getConciseType(), variantData,
(qint64 *)pTargetValue, pnLength ) );
case SQL_C_UBIGINT:
- MYODBCDbgReturn( getData( variantData, (quint64 *)pTargetValue, pnLength ) );
+ MYODBCDbgReturn( getData( getImpRowDesc()->getConciseType(), variantData,
(quint64 *)pTargetValue, pnLength ) );
case SQL_C_BINARY:
- MYODBCDbgReturn( getData( variantData, pTargetValue, nBufferLength, pnLength
) );
+ MYODBCDbgReturn( getData( getImpRowDesc()->getConciseType(), variantData,
pTargetValue, nBufferLength, pnLength ) );
case SQL_C_TYPE_DATE:
- MYODBCDbgReturn( getData( variantData, (SQL_DATE_STRUCT *)pTargetValue,
pnLength ) );
+ MYODBCDbgReturn( getData( getImpRowDesc()->getConciseType(), variantData,
(SQL_DATE_STRUCT *)pTargetValue, pnLength ) );
case SQL_C_TYPE_TIME:
- MYODBCDbgReturn( getData( variantData, (SQL_TIME_STRUCT *)pTargetValue,
pnLength ) );
+ MYODBCDbgReturn( getData( getImpRowDesc()->getConciseType(), variantData,
(SQL_TIME_STRUCT *)pTargetValue, pnLength ) );
case SQL_C_TYPE_TIMESTAMP:
- MYODBCDbgReturn( getData( variantData, (SQL_TIMESTAMP_STRUCT *)pTargetValue,
pnLength ) );
+ MYODBCDbgReturn( getData( getImpRowDesc()->getConciseType(), variantData,
(SQL_TIMESTAMP_STRUCT *)pTargetValue, pnLength ) );
case SQL_C_NUMERIC:
{
@@ -270,7 +278,7 @@
pNumeric->precision = 10; /* default precision */
pNumeric->scale = 0; /* default scale */
- MYODBCDbgReturn( getData( variantData, pNumeric, pnLength ) );
+ MYODBCDbgReturn( getData( getImpRowDesc()->getConciseType(),
variantData, pNumeric, pnLength ) );
}
break;
@@ -590,7 +598,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN MResult::getData( const QVariant &variantData, SQLWCHAR *psTarget,
SQLINTEGER nCharsMax, SQLINTEGER *nCharsAvailable )
+SQLRETURN MResult::getData( SQLSMALLINT nConciseTypeSQL, const QVariant &variantData,
SQLWCHAR *psTarget, SQLINTEGER nCharsMax, SQLINTEGER *nCharsAvailable )
{
MYODBCDbgEnter();
@@ -603,7 +611,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN MResult::getData( const QVariant &variantData, short int *pnTarget,
SQLINTEGER *pnLength );
+SQLRETURN MResult::getData( SQLSMALLINT nConciseTypeSQL, const QVariant &variantData,
short int *pnTarget, SQLINTEGER *pnLength );
{
MYODBCDbgEnter();
@@ -615,7 +623,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN MResult::getData( const QVariant &variantData, unsigned short int
*pnTarget, SQLINTEGER *pnLength );
+SQLRETURN MResult::getData( SQLSMALLINT nConciseTypeSQL, const QVariant &variantData,
unsigned short int *pnTarget, SQLINTEGER *pnLength );
{
MYODBCDbgEnter();
@@ -627,7 +635,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN MResult::getData( const QVariant &variantData, long int *pnTarget,
SQLINTEGER *pnLength );
+SQLRETURN MResult::getData( SQLSMALLINT nConciseTypeSQL, const QVariant &variantData,
long int *pnTarget, SQLINTEGER *pnLength );
{
MYODBCDbgEnter();
@@ -639,7 +647,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN MResult::getData( const QVariant &variantData, unsigned long int *pnTarget,
SQLINTEGER *pnLength );
+SQLRETURN MResult::getData( SQLSMALLINT nConciseTypeSQL, const QVariant &variantData,
unsigned long int *pnTarget, SQLINTEGER *pnLength );
{
MYODBCDbgEnter();
@@ -651,7 +659,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN MResult::getData( const QVariant &variantData, float *pnTarget, SQLINTEGER
*pnLength );
+SQLRETURN MResult::getData( SQLSMALLINT nConciseTypeSQL, const QVariant &variantData,
float *pnTarget, SQLINTEGER *pnLength );
{
MYODBCDbgEnter();
@@ -663,7 +671,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN MResult::getData( const QVariant &variantData, double *pnTarget, SQLINTEGER
*pnLength );
+SQLRETURN MResult::getData( SQLSMALLINT nConciseTypeSQL, const QVariant &variantData,
double *pnTarget, SQLINTEGER *pnLength );
{
MYODBCDbgEnter();
@@ -675,7 +683,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN MResult::getData( const QVariant &variantData, char *pnTarget, SQLINTEGER
*pnLength );
+SQLRETURN MResult::getData( SQLSMALLINT nConciseTypeSQL, const QVariant &variantData,
char *pnTarget, SQLINTEGER *pnLength );
{
MYODBCDbgEnter();
@@ -687,7 +695,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN MResult::getData( const QVariant &variantData, unsigned char *pnTarget,
SQLINTEGER *pnLength );
+SQLRETURN MResult::getData( SQLSMALLINT nConciseTypeSQL, const QVariant &variantData,
unsigned char *pnTarget, SQLINTEGER *pnLength );
{
MYODBCDbgEnter();
@@ -699,7 +707,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN MResult::getData( const QVariant &variantData, qint64 *pnTarget, SQLINTEGER
*pnLength );
+SQLRETURN MResult::getData( SQLSMALLINT nConciseTypeSQL, const QVariant &variantData,
qint64 *pnTarget, SQLINTEGER *pnLength );
{
MYODBCDbgEnter();
@@ -711,7 +719,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN MResult::getData( const QVariant &variantData, quint64 *pnTarget,
SQLINTEGER *pnLength );
+SQLRETURN MResult::getData( SQLSMALLINT nConciseTypeSQL, const QVariant &variantData,
quint64 *pnTarget, SQLINTEGER *pnLength );
{
MYODBCDbgEnter();
@@ -723,7 +731,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN MResult::getData( const QVariant &variantData, SQLPOINTER pTarget,
SQLINTEGER nBytesMax, SQLINTEGER *pnBytesAvailable );
+SQLRETURN MResult::getData( SQLSMALLINT nConciseTypeSQL, const QVariant &variantData,
SQLPOINTER pTarget, SQLINTEGER nBytesMax, SQLINTEGER *pnBytesAvailable );
{
MYODBCDbgEnter();
@@ -735,7 +743,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN MResult::getData( const QVariant &variantData, SQL_DATE_STRUCT *pTarget,
SQLINTEGER *pnLength );
+SQLRETURN MResult::getData( SQLSMALLINT nConciseTypeSQL, const QVariant &variantData,
SQL_DATE_STRUCT *pTarget, SQLINTEGER *pnLength );
{
MYODBCDbgEnter();
@@ -750,7 +758,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN MResult::getData( const QVariant &variantData, SQL_TIME_STRUCT *pTarget,
SQLINTEGER *pnLength );
+SQLRETURN MResult::getData( SQLSMALLINT nConciseTypeSQL, const QVariant &variantData,
SQL_TIME_STRUCT *pTarget, SQLINTEGER *pnLength );
{
MYODBCDbgEnter();
@@ -765,7 +773,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN MResult::getData( const QVariant &variantData, SQL_TIMESTAMP_STRUCT
*pTarget, SQLINTEGER *pnLength );
+SQLRETURN MResult::getData( SQLSMALLINT nConciseTypeSQL, const QVariant &variantData,
SQL_TIMESTAMP_STRUCT *pTarget, SQLINTEGER *pnLength );
{
MYODBCDbgEnter();
@@ -797,14 +805,14 @@
which govern this.
\param variantData Source data.
- \param pTarget Pointer to a SQL_NUMERIC_STRUCT.
+ \param pTarget Pointer to a SQL_NUMERIC_STRUCT. The precision and scale fields
must be valid values.
\param pnLength Buffer where we can set the length (number of bytes) we have
available.
\return SQLRETURN
\sa getData()
*/
-SQLRETURN MResult::getData( const QVariant &variantData, SQL_NUMERIC_STRUCT *pTarget,
SQLINTEGER *pnLength );
+SQLRETURN MResult::getData( SQLSMALLINT nConciseTypeSQL, const QVariant &variantData,
SQL_NUMERIC_STRUCT *pTarget, SQLINTEGER *pnLength );
{
MYODBCDbgEnter();
Modified: MYSQLPlus/MYSQLPlusLib/MResult.h
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MResult.h 2006-05-16 18:42:41 UTC (rev 246)
+++ MYSQLPlus/MYSQLPlusLib/MResult.h 2006-05-16 20:55:09 UTC (rev 247)
@@ -69,7 +69,7 @@
virtual BOOLEAN isValidColumn( uint nColumn );
virtual BOOLEAN isValidRow() = 0;
virtual BOOLEAN isValidRow( qulonglong nRow ) = 0;
- BOOLEAN isBuffered();
+ BOOLEAN isBuffered();
virtual BOOLEAN isDirty() = 0;
protected:
@@ -89,22 +89,22 @@
SQLRETURN getData( SQLUSMALLINT nColumn, MDescriptorRecordARD
*pDescriptorRecord );
SQLRETURN getData( SQLUSMALLINT nColumn, MDescriptorRecordIRD
*pDescriptorRecord, SQLPOINTER pTargetValue, SQLINTEGER nBufferLength, SQLINTEGER
*pnLength, SQLINTEGER *pnIndicator );
- SQLRETURN getData( const QVariant &variantData, SQLWCHAR *psTarget,
SQLINTEGER nCharsMax, SQLINTEGER *nCharsAvailable );
- SQLRETURN getData( const QVariant &variantData, short int *pnTarget,
SQLINTEGER *pnLength );
- SQLRETURN getData( const QVariant &variantData, unsigned short int
*pnTarget, SQLINTEGER *pnLength );
- SQLRETURN getData( const QVariant &variantData, long int *pnTarget,
SQLINTEGER *pnLength );
- SQLRETURN getData( const QVariant &variantData, unsigned long int
*pnTarget, SQLINTEGER *pnLength );
- SQLRETURN getData( const QVariant &variantData, float *pnTarget, SQLINTEGER
*pnLength );
- SQLRETURN getData( const QVariant &variantData, double *pnTarget,
SQLINTEGER *pnLength );
- SQLRETURN getData( const QVariant &variantData, char *pnTarget, SQLINTEGER
*pnLength );
- SQLRETURN getData( const QVariant &variantData, unsigned char *pnTarget,
SQLINTEGER *pnLength );
- SQLRETURN getData( const QVariant &variantData, qint64 *pnTarget,
SQLINTEGER *pnLength );
- SQLRETURN getData( const QVariant &variantData, quint64 *pnTarget,
SQLINTEGER *pnLength );
- SQLRETURN getData( const QVariant &variantData, SQLPOINTER pTarget,
SQLINTEGER nBytesMax, SQLINTEGER *pnBytesAvailable );
- SQLRETURN getData( const QVariant &variantData, SQL_DATE_STRUCT *pTarget,
SQLINTEGER *pnLength );
- SQLRETURN getData( const QVariant &variantData, SQL_TIME_STRUCT *pTarget,
SQLINTEGER *pnLength );
- SQLRETURN getData( const QVariant &variantData, SQL_TIMESTAMP_STRUCT
*pTarget, SQLINTEGER *pnLength );
- SQLRETURN getData( const QVariant &variantData, SQL_NUMERIC_STRUCT
*pTarget, SQLINTEGER *pnLength );
+ SQLRETURN getData( SQLSMALLINT nConciseTypeSQL, const QVariant
&variantData, SQLWCHAR *psTarget, SQLINTEGER nCharsMax, SQLINTEGER *nCharsAvailable
);
+ SQLRETURN getData( SQLSMALLINT nConciseTypeSQL, const QVariant
&variantData, short int *pnTarget, SQLINTEGER *pnLength );
+ SQLRETURN getData( SQLSMALLINT nConciseTypeSQL, const QVariant
&variantData, unsigned short int *pnTarget, SQLINTEGER *pnLength );
+ SQLRETURN getData( SQLSMALLINT nConciseTypeSQL, const QVariant
&variantData, long int *pnTarget, SQLINTEGER *pnLength );
+ SQLRETURN getData( SQLSMALLINT nConciseTypeSQL, const QVariant
&variantData, unsigned long int *pnTarget, SQLINTEGER *pnLength );
+ SQLRETURN getData( SQLSMALLINT nConciseTypeSQL, const QVariant
&variantData, float *pnTarget, SQLINTEGER *pnLength );
+ SQLRETURN getData( SQLSMALLINT nConciseTypeSQL, const QVariant
&variantData, double *pnTarget, SQLINTEGER *pnLength );
+ SQLRETURN getData( SQLSMALLINT nConciseTypeSQL, const QVariant
&variantData, char *pnTarget, SQLINTEGER *pnLength );
+ SQLRETURN getData( SQLSMALLINT nConciseTypeSQL, const QVariant
&variantData, unsigned char *pnTarget, SQLINTEGER *pnLength );
+ SQLRETURN getData( SQLSMALLINT nConciseTypeSQL, const QVariant
&variantData, qint64 *pnTarget, SQLINTEGER *pnLength );
+ SQLRETURN getData( SQLSMALLINT nConciseTypeSQL, const QVariant
&variantData, quint64 *pnTarget, SQLINTEGER *pnLength );
+ SQLRETURN getData( SQLSMALLINT nConciseTypeSQL, const QVariant
&variantData, SQLPOINTER pTarget, SQLINTEGER nBytesMax, SQLINTEGER *pnBytesAvailable
);
+ SQLRETURN getData( SQLSMALLINT nConciseTypeSQL, const QVariant
&variantData, SQL_DATE_STRUCT *pTarget, SQLINTEGER *pnLength );
+ SQLRETURN getData( SQLSMALLINT nConciseTypeSQL, const QVariant
&variantData, SQL_TIME_STRUCT *pTarget, SQLINTEGER *pnLength );
+ SQLRETURN getData( SQLSMALLINT nConciseTypeSQL, const QVariant
&variantData, SQL_TIMESTAMP_STRUCT *pTarget, SQLINTEGER *pnLength );
+ SQLRETURN getData( SQLSMALLINT nConciseTypeSQL, const QVariant
&variantData, SQL_NUMERIC_STRUCT *pTarget, SQLINTEGER *pnLength );
/* doers */
virtual SQLRETURN doStateRollBack( STATE nState ) = 0;
Modified: MYSQLPlus/MYSQLPlusLib/MStatement.cpp
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MStatement.cpp 2006-05-16 18:42:41 UTC (rev 246)
+++ MYSQLPlus/MYSQLPlusLib/MStatement.cpp 2006-05-16 20:55:09 UTC (rev 247)
@@ -430,7 +430,7 @@
/* get data */
SQLINTEGER nLength;
SQLINTEGER nIndicator;
- SQLRETURN nReturn = pResult->getData( nColumnNumber, nTargetType, pTargetValue,
nBufferLength, &nLength, &nIndicator, getImpRowDesc()->getRecord(
nColumnNumber ) );
+ SQLRETURN nReturn = pResult->getData( nColumnNumber, nTargetType, pTargetValue,
nBufferLength, &nLength, &nIndicator );
if ( !SQL_SUCCEEDED(nReturn) )
MYODBCDbgReturn( nReturn );
| Thread |
|---|
| • Connector/ODBC 5 commit: r247 - MYSQLPlus/MYSQLPlusLib | pharvey | 16 May |