List:Commits« Previous MessageNext Message »
From:pharvey Date:May 16 2006 6:12pm
Subject:Connector/ODBC 5 commit: r245 - MYSQLPlus/MYSQLPlusLib
View as plain text  
Modified:
   MYSQLPlus/MYSQLPlusLib/MResult.cpp
Log:


Modified: MYSQLPlus/MYSQLPlusLib/MResult.cpp
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MResult.cpp	2006-05-16 14:51:07 UTC (rev 244)
+++ MYSQLPlus/MYSQLPlusLib/MResult.cpp	2006-05-16 18:12:02 UTC (rev 245)
@@ -189,6 +189,13 @@
             break;
 
         case SQL_C_CHAR:
+        case SQL_C_WCHAR:
+            /*!
+                \internal
+                \todo
+
+                Differentiate between char and wide-char.
+            */
             MYODBCDbgReturn( getData( variantData, (SQLWCHAR *)pTargetValue,
nBufferLength * sizeof(SQLWCHAR), SQLINTEGER pnLength ) );
 
         case SQL_C_SSHORT:
@@ -249,6 +256,9 @@
             break;
 
         case SQL_C_GUID:
+            SQLGUID;
+            break;
+
         case SQL_C_INTERVAL_MONTH:
         case SQL_C_INTERVAL_YEAR:
         case SQL_C_INTERVAL_YEAR_TO_MONTH:
@@ -262,6 +272,9 @@
         case SQL_C_INTERVAL_HOUR_TO_MINUTE:
         case SQL_C_INTERVAL_HOUR_TO_SECOND:
         case SQL_C_INTERVAL_MINUTE_TO_SECOND:
+            SQL_INTERVAL_STRUCT;
+            break;
+
         default:
             MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY003 ) );
     }
@@ -383,58 +396,167 @@
                               pDescriptorRecord ) );
 }
 
+/*!
+    \brief      Gets data based upon the type information in the data source.
+
+                This is used to support SQLGetData() (and such) when the type is
SQL_C_DEFAULT. In such a case
+                we must return the data in the default C format specified in the
"Converting Data from SQL to C Data Types"
+                table of the ODBC specification.
+
+                This version of getData() is probably only called from a higher-level
getData(). In fact; the
+                bulk of the work is done by calling a higher-level getData() with the
default C data type specified.
+
+    \note       MySQL does not, at this time, support all SQL types but this method does
;)
+
+    \param      nColumn                 Column number as per SQLGetData().
+    \param      pDescriptorRecord       The IRD record corresponding to nColumn. We use
this determine the SQL type at the
+                                        data source and then use this to determine the
default C data type we will 
+                                        return the data as.
+    \param      pTargetValue            Pointer to a data buffer as per SQLGetData().
+    \param      nBufferLength           Size of buffer at pTargetValue as per
SQLGetData().
+    \param      pnLength                Buffer where we can put the number or bytes
available to return as per StrLenIndPtr for SQLGetData().
+                                        This can be NULL.
+    \param      pnIndicator             Buffer where we can put a value to indicate if
NULL data as per StrLenIndPtr for SQLGetData().
+                                        Must NOT be NULL.
+
+    \sa         getData
+                SQLGetData
+                "Converting Data from SQL to C Data Types"
+               
"http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcconverting_data_from_sql_to_c_data_types.asp"
+*/
 SQLRETURN MResult::getData( SQLUSMALLINT nColumn, MDescriptorRecordIRD
*pDescriptorRecord, SQLPOINTER pTargetValue, SQLINTEGER nBufferLength, SQLINTEGER
*pnLength, SQLINTEGER *pnIndicator )
 {
     MYODBCDbgEnter();
 
     /*!
-        \internal
+        \internal ODBC RULE
 
+        We use the translation table from the spec under "Converting Data from SQL to C
Data Types".
+
         \note
 
         We do not rely on SQL_C_* values synching up with SQL_* values.
+
+        \sa
+
+       
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcconverting_data_from_sql_to_c_data_types.asp
     */
-    switch ( pDescriptorRecord->getType() )
+    switch ( pDescriptorRecord->getConciseType() )
     {
         case SQL_CHAR:
         case SQL_VARCHAR:
         case SQL_LONGVARCHAR:
+            MYODBCDbgReturn( getData( nColumn, SQL_C_CHAR, pTargetValue, nBufferLength,
pnLength, pnIndicator ) );
+
         case SQL_WCHAR:
         case SQL_WVARCHAR:
-        case SQL_WLONGVARCHAR: 
+        case SQL_WLONGVARCHAR:
+            MYODBCDbgReturn( getData( nColumn, SQL_C_WCHAR, pTargetValue, nBufferLength,
pnLength, pnIndicator ) );
+
+        case SQL_DECIMAL:
+        case SQL_NUMERIC:
             /*!
-                \internal
-                \todo
+                \internal ODBC RULE
 
-                Differentiate between char and wide-char.
+                This conversion is SQL_C_CHAR, not SQL_C_NUMERIC - as one may otherwise
expect.
             */
             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_BIT:
+            MYODBCDbgReturn( getData( nColumn, SQL_C_BIT, pTargetValue, nBufferLength,
pnLength, pnIndicator ) );
 
+        case SQL_TINYINT:
+            if ( pDescriptorRecord->getUnsigned() == SQL_TRUE )
+                MYODBCDbgReturn( getData( nColumn, SQL_C_STINYINT, pTargetValue,
nBufferLength, pnLength, pnIndicator ) );
+            MYODBCDbgReturn( getData( nColumn, SQL_C_UTINYINT, pTargetValue,
nBufferLength, pnLength, pnIndicator ) );
+
         case SQL_SMALLINT:
+            if ( pDescriptorRecord->getUnsigned() == SQL_TRUE )
+                MYODBCDbgReturn( getData( nColumn, SQL_C_SSHORT, pTargetValue,
nBufferLength, pnLength, pnIndicator ) );
+            MYODBCDbgReturn( getData( nColumn, SQL_C_USHORT, pTargetValue, nBufferLength,
pnLength, pnIndicator ) );
+
         case SQL_INTEGER:
+            if ( pDescriptorRecord->getUnsigned() == SQL_TRUE )
+                MYODBCDbgReturn( getData( nColumn, SQL_C_SLONG, pTargetValue,
nBufferLength, pnLength, pnIndicator ) );
+            MYODBCDbgReturn( getData( nColumn, SQL_C_ULONG, pTargetValue, nBufferLength,
pnLength, pnIndicator ) );
+
+        case SQL_BIGINT:
+            if ( pDescriptorRecord->getUnsigned() == SQL_TRUE )
+                MYODBCDbgReturn( getData( nColumn, SQL_C_SBIGINT, pTargetValue,
nBufferLength, pnLength, pnIndicator ) );
+            MYODBCDbgReturn( getData( nColumn, SQL_C_UBIGINT, pTargetValue,
nBufferLength, pnLength, pnIndicator ) );
+
         case SQL_REAL:
+            MYODBCDbgReturn( getData( nColumn, SQL_C_FLOAT, pTargetValue, nBufferLength,
pnLength, pnIndicator ) );
+
         case SQL_FLOAT:
+            MYODBCDbgReturn( getData( nColumn, SQL_C_DOUBLE, pTargetValue, nBufferLength,
pnLength, pnIndicator ) );
+
         case SQL_DOUBLE:
-        case SQL_BIT:
-        case SQL_TINYINT:
-        case SQL_BIGINT:
+            MYODBCDbgReturn( getData( nColumn, SQL_C_DOUBLE, pTargetValue, nBufferLength,
pnLength, pnIndicator ) );
 
         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_TYPE_DATE:
+            MYODBCDbgReturn( getData( nColumn, SQL_C_TYPE_DATE, pTargetValue,
nBufferLength, pnLength, pnIndicator ) );
 
-        case SQL_INTERVAL:
+        case SQL_TYPE_TIME:
+            MYODBCDbgReturn( getData( nColumn, SQL_C_TYPE_TIME, pTargetValue,
nBufferLength, pnLength, pnIndicator ) );
+
+        case SQL_TYPE_TIMESTAMP:
+            MYODBCDbgReturn( getData( nColumn, SQL_C_TYPE_TIMESTAMP, pTargetValue,
nBufferLength, pnLength, pnIndicator ) );
+
+        case SQL_INTERVAL_MONTH:
+            MYODBCDbgReturn( getData( nColumn, SQL_C_INTERVAL_MONTH, pTargetValue,
nBufferLength, pnLength, pnIndicator ) );
+
+        case SQL_INTERVAL_YEAR:
+            MYODBCDbgReturn( getData( nColumn, SQL_C_INTERVAL_YEAR, pTargetValue,
nBufferLength, pnLength, pnIndicator ) );
+
+        case SQL_INTERVAL_YEAR_TO_MONTH:
+            MYODBCDbgReturn( getData( nColumn, SQL_C_INTERVAL_YEAR_TO_MONTH,
pTargetValue, nBufferLength, pnLength, pnIndicator ) );
+
+        case SQL_INTERVAL_DAY:
+            MYODBCDbgReturn( getData( nColumn, SQL_C_INTERVAL_DAY, pTargetValue,
nBufferLength, pnLength, pnIndicator ) );
+
+        case SQL_INTERVAL_HOUR:
+            MYODBCDbgReturn( getData( nColumn, SQL_C_INTERVAL_HOUR, pTargetValue,
nBufferLength, pnLength, pnIndicator ) );
+
+        case SQL_INTERVAL_MINUTE:
+            MYODBCDbgReturn( getData( nColumn, SQL_C_INTERVAL_MINUTE, pTargetValue,
nBufferLength, pnLength, pnIndicator ) );
+
+        case SQL_INTERVAL_SECOND:
+            MYODBCDbgReturn( getData( nColumn, SQL_C_INTERVAL_SECOND, pTargetValue,
nBufferLength, pnLength, pnIndicator ) );
+
+        case SQL_INTERVAL_DAY_TO_HOUR:
+            MYODBCDbgReturn( getData( nColumn, SQL_C_INTERVAL_DAY_TO_HOUR, pTargetValue,
nBufferLength, pnLength, pnIndicator ) );
+
+        case SQL_INTERVAL_DAY_TO_MINUTE:
+            MYODBCDbgReturn( getData( nColumn, SQL_C_INTERVAL_DAY_TO_MINUTE,
pTargetValue, nBufferLength, pnLength, pnIndicator ) );
+
+        case SQL_INTERVAL_DAY_TO_SECOND:
+            MYODBCDbgReturn( getData( nColumn, SQL_C_INTERVAL_DAY_TO_SECOND,
pTargetValue, nBufferLength, pnLength, pnIndicator ) );
+
+        case SQL_INTERVAL_HOUR_TO_MINUTE:
+            MYODBCDbgReturn( getData( nColumn, SQL_C_INTERVAL_HOUR_TO_MINUTE,
pTargetValue, nBufferLength, pnLength, pnIndicator ) );
+
+        case SQL_INTERVAL_HOUR_TO_SECOND:
+            MYODBCDbgReturn( getData( nColumn, SQL_C_INTERVAL_HOUR_TO_SECOND,
pTargetValue, nBufferLength, pnLength, pnIndicator ) );
+
+        case SQL_INTERVAL_MINUTE_TO_SECOND:
+            MYODBCDbgReturn( getData( nColumn, SQL_C_INTERVAL_MINUTE_TO_SECOND,
pTargetValue, nBufferLength, pnLength, pnIndicator ) );
+
         case SQL_GUID:
+            /*!
+                \internal ODBC RULE
 
+                This conversion is SQL_C_CHAR, not SQL_C_GUID - as one may otherwise
expect.
+            */
+            MYODBCDbgReturn( getData( nColumn, SQL_C_CHAR, pTargetValue, nBufferLength,
pnLength, pnIndicator ) );
+
         default:
+            MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006 ) );
     }
 
     MYODBCDbgReturn( SQL_SUCCESS );

Thread
Connector/ODBC 5 commit: r245 - MYSQLPlus/MYSQLPlusLibpharvey16 May