List:Commits« Previous MessageNext Message »
From:pharvey Date:May 16 2006 2:51pm
Subject:Connector/ODBC 5 commit: r244 - MYSQLPlus/MYSQLPlusLib
View as plain text  
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/MYSQLPlusLibpharvey16 May