List:Commits« Previous MessageNext Message »
From:pharvey Date:May 18 2006 6:33am
Subject:Connector/ODBC 5 commit: r254 - MYSQLPlus/MYSQLPlusLib
View as plain text  
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/MYSQLPlusLibpharvey18 May