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/MYSQLPlusLib | pharvey | 16 May |