Modified:
trunk/SDK/C/Library/MYODBCC.cpp
trunk/SDK/C/include/MYODBCC.h
trunk/SDK/Dbg/include/MYODBCDbg.h
trunk/SDK/MYSQLPlus/Library/MResult.cpp
trunk/SDK/MYSQLPlus/Library/MResult.h
trunk/SDK/MYSQLPlus/Library/MStatement.cpp
Log:
FIX: SQLBindParameter now handles SQL_C_DEFAULT.
Modified: trunk/SDK/C/Library/MYODBCC.cpp
===================================================================
--- trunk/SDK/C/Library/MYODBCC.cpp 2006-11-04 23:42:03 UTC (rev 652)
+++ trunk/SDK/C/Library/MYODBCC.cpp 2006-11-05 12:05:55 UTC (rev 653)
@@ -2060,6 +2060,153 @@
return "unknown";
}
+/*!
+ \brief Returns the SQL_C_* type for the given SQL type.
+
+ This contains the rules for getting the C type when SQL_C_DEFAULT has been
provided.
+*/
+SQLSMALLINT MYODBCC::getCDefault( SQLINTEGER nODBCVersion, SQLSMALLINT nSQLType,
SQLSMALLINT nUnsigned )
+{
+ /*!
+ \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 ( nSQLType )
+ {
+ case SQL_CHAR:
+ case SQL_VARCHAR:
+ case SQL_LONGVARCHAR:
+ return SQL_C_CHAR;
+
+ case SQL_WCHAR:
+ case SQL_WVARCHAR:
+ case SQL_WLONGVARCHAR:
+ return SQL_C_WCHAR;
+
+ case SQL_DECIMAL:
+ case SQL_NUMERIC:
+ /*!
+ \internal ODBC RULE
+
+ This conversion is SQL_C_CHAR, not SQL_C_NUMERIC - as one may otherwise
expect.
+ */
+ return SQL_C_CHAR;
+
+ case SQL_BIT:
+ return SQL_C_BIT;
+
+ case SQL_TINYINT:
+ if ( nUnsigned == SQL_TRUE )
+ return SQL_C_UTINYINT;
+ return SQL_C_STINYINT;
+
+ case SQL_SMALLINT:
+ if ( nUnsigned == SQL_TRUE )
+ return SQL_C_USHORT;
+ return SQL_C_SSHORT;
+
+ case SQL_INTEGER:
+ if ( nUnsigned == SQL_TRUE )
+ return SQL_C_ULONG;
+ return SQL_C_SLONG;
+
+ case SQL_BIGINT:
+ if ( nUnsigned == SQL_TRUE )
+ return SQL_C_UBIGINT;
+ return SQL_C_SBIGINT;
+
+ case SQL_REAL:
+ return SQL_C_FLOAT;
+
+ case SQL_FLOAT:
+ return SQL_C_DOUBLE;
+
+ case SQL_DOUBLE:
+ return SQL_C_DOUBLE;
+
+ case SQL_BINARY:
+ case SQL_VARBINARY:
+ case SQL_LONGVARBINARY:
+ return SQL_C_BINARY;
+
+ case SQL_TYPE_DATE:
+ if ( nODBCVersion == SQL_OV_ODBC2 )
+ return SQL_C_DATE;
+
+ return SQL_C_TYPE_DATE;
+
+ case SQL_TYPE_TIME:
+ if ( nODBCVersion == SQL_OV_ODBC2 )
+ return SQL_C_TIME;
+
+ return SQL_C_TYPE_TIME;
+
+ case SQL_TYPE_TIMESTAMP:
+ if ( nODBCVersion == SQL_OV_ODBC2 )
+ return SQL_C_TIMESTAMP;
+
+ return SQL_C_TYPE_TIMESTAMP;
+
+ case SQL_INTERVAL_MONTH:
+ return SQL_C_INTERVAL_MONTH;
+
+ case SQL_INTERVAL_YEAR:
+ return SQL_C_INTERVAL_YEAR;
+
+ case SQL_INTERVAL_YEAR_TO_MONTH:
+ return SQL_C_INTERVAL_YEAR_TO_MONTH;
+
+ case SQL_INTERVAL_DAY:
+ return SQL_C_INTERVAL_DAY;
+
+ case SQL_INTERVAL_HOUR:
+ return SQL_C_INTERVAL_HOUR;
+
+ case SQL_INTERVAL_MINUTE:
+ return SQL_C_INTERVAL_MINUTE;
+
+ case SQL_INTERVAL_SECOND:
+ return SQL_C_INTERVAL_SECOND;
+
+ case SQL_INTERVAL_DAY_TO_HOUR:
+ return SQL_C_INTERVAL_DAY_TO_HOUR;
+
+ case SQL_INTERVAL_DAY_TO_MINUTE:
+ return SQL_C_INTERVAL_DAY_TO_MINUTE;
+
+ case SQL_INTERVAL_DAY_TO_SECOND:
+ return SQL_C_INTERVAL_DAY_TO_SECOND;
+
+ case SQL_INTERVAL_HOUR_TO_MINUTE:
+ return SQL_C_INTERVAL_HOUR_TO_MINUTE;
+
+ case SQL_INTERVAL_HOUR_TO_SECOND:
+ return SQL_C_INTERVAL_HOUR_TO_SECOND;
+
+ case SQL_INTERVAL_MINUTE_TO_SECOND:
+ return SQL_C_INTERVAL_MINUTE_TO_SECOND;
+
+ case SQL_GUID:
+ /*!
+ \internal ODBC RULE
+
+ This conversion is SQL_C_CHAR, not SQL_C_GUID - as one may otherwise
expect.
+ */
+ return SQL_C_CHAR;
+ }
+
+ return SQL_C_CHAR;
+}
+
/* this is a temp solution to the sudden realization that findChildren() returns all
objects - probably because we do not use Q_OBJECT */
QList<QObject*> MYODBCC::getChildren( const QObject *pObject, const QString
&stringObjectName, bool bStartsWith )
{
Modified: trunk/SDK/C/include/MYODBCC.h
===================================================================
--- trunk/SDK/C/include/MYODBCC.h 2006-11-04 23:42:03 UTC (rev 652)
+++ trunk/SDK/C/include/MYODBCC.h 2006-11-05 12:05:55 UTC (rev 653)
@@ -552,6 +552,8 @@
static QString getSimulateCursorString( SQLUINTEGER nSimulateCursor );
static QString getUseBookmarksString( SQLUINTEGER nUseBookmarks );
+ static SQLSMALLINT getCDefault( SQLINTEGER nODBCVersion, SQLSMALLINT nSQLType,
SQLSMALLINT nUnsigned = SQL_FALSE );
+
static QList<QObject*> getChildren( const QObject *pObject, const QString
&stringObjectName, bool bStartsWith = false );
static void * doMemCpy( void *pDest, const void *pSrc, size_t nBytes );
Modified: trunk/SDK/Dbg/include/MYODBCDbg.h
===================================================================
--- trunk/SDK/Dbg/include/MYODBCDbg.h 2006-11-04 23:42:03 UTC (rev 652)
+++ trunk/SDK/Dbg/include/MYODBCDbg.h 2006-11-05 12:05:55 UTC (rev 653)
@@ -188,9 +188,7 @@
{\
if ( gpMYODBCDbg )\
{\
- QString stringMessage_;\
- QTextStream( &stringMessage_ ) << A;\
- gpMYODBCDbg->doReturn( __FILE__, __LINE__, __FUNCTION__, stringMessage_ );\
+ gpMYODBCDbg->doReturn( __FILE__, __LINE__, __FUNCTION__, QString( "%1" ).arg( A )
);\
}\
return ( A );\
}
Modified: trunk/SDK/MYSQLPlus/Library/MResult.cpp
===================================================================
--- trunk/SDK/MYSQLPlus/Library/MResult.cpp 2006-11-04 23:42:03 UTC (rev 652)
+++ trunk/SDK/MYSQLPlus/Library/MResult.cpp 2006-11-05 12:05:55 UTC (rev 653)
@@ -3971,7 +3971,7 @@
/* case SQL_C_DEFAULT: */
}
- MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_HY000, 0,
tr("unknown C data type") ) );
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_HY000, 0, QString(
tr("unknown C data type %1") ).arg(
pResultSetData->pDescriptorRecordAPD->getConciseType() ) ) );
}
SQLRETURN MResult::fromCharacterC( MResultSetData *pResultSetData )
Modified: trunk/SDK/MYSQLPlus/Library/MResult.h
===================================================================
--- trunk/SDK/MYSQLPlus/Library/MResult.h 2006-11-04 23:42:03 UTC (rev 652)
+++ trunk/SDK/MYSQLPlus/Library/MResult.h 2006-11-05 12:05:55 UTC (rev 653)
@@ -318,7 +318,7 @@
protected:
MResultGetData resultGetData; /*!< to support getData() (in particular;
chunking) */
- MResultSetData resultSetData; /*!< to support doSetData() (in particular;
chunking) */
+ MResultSetData resultSetData; /*!< to support doBindParameter()
*/
SQLUSMALLINT nRowSetRow; /*!< Current row in rowset.
*/
SQLUSMALLINT nRowSetRows; /*!< Is RowSetSize but will be less when
RowSet goes beyond ResultSetRows. */
Modified: trunk/SDK/MYSQLPlus/Library/MStatement.cpp
===================================================================
--- trunk/SDK/MYSQLPlus/Library/MStatement.cpp 2006-11-04 23:42:03 UTC (rev 652)
+++ trunk/SDK/MYSQLPlus/Library/MStatement.cpp 2006-11-05 12:05:55 UTC (rev 653)
@@ -1418,7 +1418,7 @@
MYODBCDbgEnter();
SQLRETURN nReturn = SQL_SUCCESS;
- BOOL bHasInfo = false;
+ BOOL bHasInfo = false;
/*!
\internal
@@ -1473,6 +1473,16 @@
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_07009A ) );
/*!
+ \internal ODBC RULE
+
+ SQL_C_DEFAULT specifies that the parameter value be transferred from
+ the default C data type for the SQL data type specified with
+ ParameterType.
+ */
+ if ( nValueType == SQL_C_DEFAULT )
+ nValueType = MYODBCC::getCDefault( getEnvironment()->getODBCVersion(),
nParameterType );
+
+ /*!
\internal ODBC RULE (DM)
The argument ParameterValuePtr was a null pointer, the argument StrLen_or_IndPtr