Modified:
MYSQLPlus/MYSQLPlusLib/MResult.cpp
Log:
Modified: MYSQLPlus/MYSQLPlusLib/MResult.cpp
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MResult.cpp 2006-05-17 23:24:02 UTC (rev 253)
+++ MYSQLPlus/MYSQLPlusLib/MResult.cpp 2006-05-18 04:33:05 UTC (rev 254)
@@ -1244,12 +1244,8 @@
values as per ODBC rules.
\note Not all source data can be converted to a SQL_NUMERIC_STRUCT. There
are ODBC rules
- which govern this.
+ which govern this - most of which may have been applied before
getting here.
- \param pResultDataTarget->variantData Source data.
- \param pTarget Pointer to a SQL_NUMERIC_STRUCT. The precision and scale fields
must be valid values.
- \param pResultDataTarget->pnBytesOrCharsRemaining Buffer where we can set the
length (number of bytes) we have available.
-
\return SQLRETURN
\sa getData()
@@ -1291,7 +1287,7 @@
so lets use a string as our starting point - in this way we hope to catch &
report any possible loss of
precision/scale :) */
if ( !pResultDataTarget->variantData.canConvert<QString>() )
- MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006 ) );
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006, 0,
tr("Variant (data conversion hub) could not convert to a string.") ) );
QString stringData = pResultDataTarget->variantData.toString().stripWhiteSpace();
@@ -1316,10 +1312,42 @@
pNumericStruct->sign = 1;
}
-
-++++++++++++++++++++
+ /* get precision & scale strings */
+ QString stringPrecision;
+ QString stringScale;
QStringList stringlistData = stringData.split( '.' );
+ if ( stringlistData.count() > 2 )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006, 0,
tr("Data was converted to string but then had too many decimal points.") ) );
+ if ( stringlistData.count() > 1 )
+ stringScale = stringlistData[1];
+ if ( stringlistData.count() > 0 )
+ stringPrecision = stringlistData[0];
+
+ /* check for truncation */
+ BOOLEAN bFractionalTruncation = false;
+
+ if ( stringPrecision.length() > pNumeric->precision )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_22003 ) );
+
+ if ( stringScale.length() > pNumeric->scale )
+ {
+ if ( pNumeric->scale == 0 )
+ stringScale = QString::null;
+ else
+ stringScale.truncate( pNumeric->scale );
+ bFractionalTruncation = true;
+ }
+
+ /* get int ver of each part */
+ BOOLEAN bOk = true;
+ int nPrecision = stringPrecision.toInt( &bOk );
+ if ( !bOk )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006, 0,
tr("Failed to convert precision part.") ) );
+ int nScale = stringScale.toInt( &bOk );
+ if ( !bOk )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006, 0,
tr("Failed to convert scale part.") ) );
+
/*!
\internal ODBC RULE
@@ -1329,10 +1357,14 @@
186AA in hexadecimal format, the value in SQL_NUMERIC_STRUCT would be "AA 86 01
00 00 ... 00",
with the number of bytes defined by the SQL_MAX_NUMERIC_LEN #define.
*/
- int nScaledInteger = 0;
- memset( pNumericStruct->val, 0, SQL_MAX_NUMERIC_LEN );
+ memset( pNumeric->val, 0, SQL_MAX_NUMERIC_LEN );
+ /*! \todo pack into 16 byte buffer */
+
+ if ( bFractionalTruncation )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_01S07 ) );
+
MYODBCDbgReturn( SQL_SUCCESS );
}
| Thread |
|---|
| • Connector/ODBC 5 commit: r254 - MYSQLPlus/MYSQLPlusLib | pharvey | 18 May |