List:Commits« Previous MessageNext Message »
From:pharvey Date:June 12 2006 8:00am
Subject:Connector/ODBC 5 commit: r326 - trunk/MYSQLPlus/MYSQLPlusLib
View as plain text  
Modified:
   trunk/MYSQLPlus/MYSQLPlusLib/MResult.cpp
   trunk/MYSQLPlus/MYSQLPlusLib/MResult.h
   trunk/MYSQLPlus/MYSQLPlusLib/MResultRes.cpp
   trunk/MYSQLPlus/MYSQLPlusLib/MResultRes.h
Log:
- more work to support SQLBindParameter

Modified: trunk/MYSQLPlus/MYSQLPlusLib/MResult.cpp
===================================================================
--- trunk/MYSQLPlus/MYSQLPlusLib/MResult.cpp	2006-06-12 05:58:11 UTC (rev 325)
+++ trunk/MYSQLPlus/MYSQLPlusLib/MResult.cpp	2006-06-12 08:00:09 UTC (rev 326)
@@ -62,6 +62,25 @@
     MYODBCDbgReturn3( "%d", false );
 }
 
+MResultPutData::MResultPutData()
+{
+    MYODBCDbgEnter();
+
+    doClear();
+
+    MYODBCDbgReturn2();
+}
+
+void MResultPutData::doClear();
+{
+    MYODBCDbgEnter();
+
+    variantData.clear();
+    pDescriptorIPD = NULL;
+
+    MYODBCDbgReturn2();
+}
+
 /*! 
     \internal
     \brief  Allocates, initializes and returns a new MYODBC_RES_HANDLE. 

Modified: trunk/MYSQLPlus/MYSQLPlusLib/MResult.h
===================================================================
--- trunk/MYSQLPlus/MYSQLPlusLib/MResult.h	2006-06-12 05:58:11 UTC (rev 325)
+++ trunk/MYSQLPlus/MYSQLPlusLib/MResult.h	2006-06-12 08:00:09 UTC (rev 326)
@@ -49,6 +49,20 @@
 };
 
 /*!
+    \brief      Data to support doPutData.
+*/
+class MResultPutData
+{
+public:
+    MResultPutData();
+
+    void doClear();
+
+    QVariant                variantData;            /*!< parameter data (may be
partially full depending upon state)        */
+    MDescriptorRecordIPD *  pDescriptorRecordIPD;   /*!< bound parameter              
                                     */
+};
+
+/*!
     \brief  Result-set.
 
             This is the base class (pure virtual) for a result-set. The problem this
@@ -131,9 +145,9 @@
     virtual BOOLEAN isDirty() = 0;
 
 protected:
-    MResultGetData  resultGetData;
+    MResultGetData  resultGetData;      /*!< to support getData()       */
+    MResultPutData  resultPutData;      /*!< to support doPutData()     */
 
-
     /* setters */
     BOOLEAN setState( STATE nState );
     virtual BOOLEAN   setBuffered( BOOLEAN bBuffered );
@@ -159,7 +173,7 @@
         \name   from*SQL
 
         These are used to convert/copy data into an initialized MResultGetData. These
methods also enforce ODBC rules 
-    generalized based upon SQL type - hence fewer methods than SQL types.
+        generalized based upon SQL type - hence fewer methods than SQL types.
 
         \sa 
 
@@ -228,6 +242,71 @@
     SQLRETURN       toIntervalMinuteToSecondC( MResultGetData  *pResultGetData );
     /*@}*/
 
+
+    /*!
+        \name   from*C
+
+        \sa 
+
+        "Converting Data from C to SQL Data Types"
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcconverting_data_from_c_to_sql_data_types.asp
+    */
+    /*@{*/
+    SQLRETURN       fromCharC( MResultPutData  *pResultPutData );                        
/*!< SQL_C_CHAR 	        SQLCHAR * 	            unsigned char *     */
+    SQLRETURN       fromWCharC( MResultPutData  *pResultPutData );                       
/*!< SQL_C_WCHAR 	        SQLWCHAR * 	            wchar_t *           */
+    SQLRETURN       fromSShortC( MResultPutData  *pResultPutData );                      
/*!< SQL_C_SSHORT 	    SQLSMALLINT 	        short int           */
+    SQLRETURN       fromUShortC( MResultPutData  *pResultPutData );                      
/*!< SQL_C_USHORT 	    SQLUSMALLINT 	        unsigned short int  */
+    SQLRETURN       fromSLongC( MResultPutData  *pResultPutData );                       
/*!< SQL_C_SLONG 	        SQLINTEGER 	            long int            */
+    SQLRETURN       fromULongC( MResultPutData  *pResultPutData );                       
/*!< SQL_C_ULONG 	        SQLUINTEGER	            unsigned long int   */
+    SQLRETURN       fromFloatC( MResultPutData  *pResultPutData );                       
/*!< SQL_C_FLOAT 	        SQLREAL 	            float               */
+    SQLRETURN       fromDoubleC( MResultPutData  *pResultPutData );                      
/*!< SQL_C_DOUBLE 	    SQLDOUBLE,SQLFLOAT      double              */
+    SQLRETURN       fromBitC( MResultPutData  *pResultPutData );                         
/*!< SQL_C_BIT 	        SQLCHAR 	            unsigned char       */
+    SQLRETURN       fromSTinyIntC( MResultPutData  *pResultPutData );                    
/*!< SQL_C_STINYINT	    SQLSCHAR 	            signed char         */
+    SQLRETURN       fromUTinyIntC( MResultPutData  *pResultPutData );                    
/*!< SQL_C_UTINYINT	    SQLCHAR 	            unsigned char       */
+    SQLRETURN       fromSBigIntC( MResultPutData  *pResultPutData );                     
/*!< SQL_C_SBIGINT 	    SQLBIGINT 	            _int64              */
+    SQLRETURN       fromUBigIntC( MResultPutData  *pResultPutData );                     
/*!< SQL_C_UBIGINT 	    SQLUBIGINT 	            unsigned _int64     */
+    SQLRETURN       fromBinaryC( MResultPutData  *pResultPutData );                      
/*!< SQL_C_BINARY 	    SQLCHAR * 	            unsigned char *     */
+    SQLRETURN       fromXmlC( MResultPutData  *pResultPutData );                         
/*!< SQL_C_XML 	        SQLCHAR * 	            unsigned char *     */
+    SQLRETURN       fromVarBookmarkC( MResultPutData  *pResultPutData );                 
/*!< SQL_C_VARBOOKMARK 	SQLCHAR * 	            unsigned char *     */
+    SQLRETURN       fromTypeDateC( MResultPutData  *pResultPutData );                    
/*!< SQL_C_TYPE_DATE 	    SQL_DATE_STRUCT         DATE_STRUCT         */
+    SQLRETURN       fromTypeTimeC( MResultPutData  *pResultPutData );                    
/*!< SQL_C_TYPE_TIME 	    SQL_TIME_STRUCT         TIME_STRUCT         */
+    SQLRETURN       fromTypeTimestampC( MResultPutData  *pResultPutData );               
/*!< SQL_C_TYPE_TIMESTAMP SQL_TIMESTAMP_STRUCT    TIMESTAMP_STRUCT    */
+    SQLRETURN       fromNumericC( MResultPutData  *pResultPutData );                     
/*!< SQL_C_NUMERIC 	    SQL_NUMERIC_STRUCT      SQL_NUMERIC_STRUCT  */
+    SQLRETURN       fromGuidC( MResultPutData  *pResultPutData );                        
/*!< SQL_C_GUID 	        SQLGUID                 SQLGUID             */
+    SQLRETURN       fromIntervalMonthC( MResultPutData  *pResultPutData );               
/*!< interval type        SQL_INTERVAL_STRUCT     SQL_INTERVAL_STRUCT */
+    SQLRETURN       fromIntervalYearC( MResultPutData  *pResultPutData );
+    SQLRETURN       fromIntervalYearToMonthC( MResultPutData  *pResultPutData );
+    SQLRETURN       fromIntervalDayC( MResultPutData  *pResultPutData );
+    SQLRETURN       fromIntervalHourC( MResultPutData  *pResultPutData );
+    SQLRETURN       fromIntervalMinuteC( MResultPutData  *pResultPutData );
+    SQLRETURN       fromIntervalSecondC( MResultPutData  *pResultPutData );
+    SQLRETURN       fromIntervalDayToHourC( MResultPutData  *pResultPutData );
+    SQLRETURN       fromIntervalDayToMinuteC( MResultPutData  *pResultPutData );
+    SQLRETURN       fromIntervalDayToSecondC( MResultPutData  *pResultPutData );
+    SQLRETURN       fromIntervalHourToMinuteC( MResultPutData  *pResultPutData );
+    SQLRETURN       fromIntervalHourToSecondC( MResultPutData  *pResultPutData );
+    SQLRETURN       fromIntervalMinuteToSecondC( MResultPutData  *pResultPutData );
+    /*@}*/
+
+    /*!
+        \name   to*SQL
+
+        \sa 
+
+        "Converting Data from C to SQL Data Types"
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcconverting_data_from_c_to_sql_data_types.asp
+    */
+    /*@{*/
+    SQLRETURN       toCharacterSQL( MResultPutData *pResultPutData );
+    SQLRETURN       toNumericSQL( MResultPutData *pResultPutData );
+    SQLRETURN       toBitSQL( MResultPutData *pResultPutData );
+    SQLRETURN       toBinarySQL( MResultPutData *pResultPutData );
+    SQLRETURN       toDateSQL( MResultPutData *pResultPutData );
+    SQLRETURN       toGuidSQL( MResultPutData *pResultPutData );
+    SQLRETURN       toTimeSQL( MResultPutData *pResultPutData );
+    SQLRETURN       toTimeStampSQL( MResultPutData *pResultPutData );
+    SQLRETURN       toIntervalYearMonthSQL( MResultPutData *pResultPutData );
+    SQLRETURN       toIntervalDayTimeSQL( MResultPutData *pResultPutData );
+    /*@}*/
+
     /* doers */
     virtual SQLRETURN doStateRollBack( STATE nState ) = 0;
     SQLRETURN doLoadMetaDataField( unsigned int nField, MYSQL_FIELD *pField,
MDescriptorIRD *pDescriptor );

Modified: trunk/MYSQLPlus/MYSQLPlusLib/MResultRes.cpp
===================================================================
--- trunk/MYSQLPlus/MYSQLPlusLib/MResultRes.cpp	2006-06-12 05:58:11 UTC (rev 325)
+++ trunk/MYSQLPlus/MYSQLPlusLib/MResultRes.cpp	2006-06-12 08:00:09 UTC (rev 326)
@@ -446,8 +446,12 @@
 
         The number of parameters specified in SQLBindParameter was less than the number
of parameters in the 
         SQL statement contained in *StatementText.
+
+        \note
+
+        In other words; all parameters markers must have bound data.
     */
-    if ( pDescriptor->count() < vectorParameterMarkers.count() )
+    if ( pDescriptor->count() < nParameterMarkers )
         MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07002 ) );
 
     /*!
@@ -459,18 +463,20 @@
         SQLBindParameter was greater than the number of parameters in the SQL statement
contained in *StatementText.
     */
 
-    /* use a copy of the template to build up statement */
-    QByteArray bytearrayStatementWithParameters = bytearrayStatementTemplate;
+    /*!
+        \internal MYODBNC RULE
 
+        A statement never starts with a parameter marker.
+    */
+    QString stringStatement = stringlistStatement.at( 0 );
+
     /* Insert any parameters */
     {
-        for ( int nParameter = 1; nParameter <= vectorParameterMarkers.count();
nParameter++ )
+        for ( int nParameter = 1; nParameter <= nParameterMarkers; nParameter++ )
         {
             MDescriptorRecord * pDescriptorRecord = pDescriptor->getRecord( nParameter
);
-            QByteArray          bytearrayParam;
 
-
-            bytearrayStatementWithParameters.insert( vectorParameterMarkers.at(
nParameter - 1 ), bytearrayParam );
+            stringStatement += 
         }
     }
 
@@ -732,40 +738,35 @@
 
         \sa mysql_real_escape_string()
     */
-    stringStatement = QString::fromUtf16( psStatement ).trimmed();
-    bytearrayStatementTemplate.clear();
-    vectorParameterMarkers.clear();
+    stringStatement = QString::fromUtf16( psStatement );
+    stringlistStatement.clear();
+    nParameterMarkers = 0;
 
     {
         QChar   cQuote;
         QString stringQuotes = "\"'";
+        QString stringStatementSegment;
 
         for ( int nChar = 0; nChar < stringStatement.length(); nChar++ )
         {
             QChar cChar = stringStatement.at( nChar );
 
+            /* parameter marker */
+            if ( !cQuote.isNull() && cChar == '?' )
+            {
+                stringlistStatement += stringStatementSegment;
+                stringStatementSegment.clear();
+                continue;
+            }
+
             /* quote opening */
             if ( cQuote.isNull() && stringQuotes.contains( cChar ) )
-            {
                 cQuote = cChar;
-                bytearrayStatementTemplate += cChar;
-                continue;
-            }
             /* quote closing */
-            if ( cQuote.isNull() && cQuote == cChar )
-            {
+            else if ( !cQuote.isNull() && cQuote == cChar )
                 cQuote = QChar::null;
-                bytearrayStatementTemplate += cChar;
-                continue;
-            }
-            /* parameter marker */
-            if ( !cQuote && cChar == '?' )
-            {
-                vectorParameterMarkers.append( nChar );
-                continue;
-            }
 
-            bytearrayStatementTemplate += cChar;
+            stringStatementSegment += cChar;
         }
     }
 
@@ -1011,8 +1012,8 @@
             getImpParamDesc()->doClear();
             getImpRowDesc()->doClear();
             stringStatement = QString::null;
-            bytearrayStatementTemplate.clear();
-            vectorParameterMarkers.clear();
+            stringlistStatement.clear();
+            nParameterMarkers = 0;
             setStatementType( STATEMENT_TYPE_NULL );
             setState(STATE_INITIALIZED );
             break;
@@ -1023,6 +1024,7 @@
             nRow = 0;
             setRowsAffected( 0 );
             resultGetData.doClear();
+            resultPutData.doClear();
             setState( STATE_PREPARED );
             break;
 

Modified: trunk/MYSQLPlus/MYSQLPlusLib/MResultRes.h
===================================================================
--- trunk/MYSQLPlus/MYSQLPlusLib/MResultRes.h	2006-06-12 05:58:11 UTC (rev 325)
+++ trunk/MYSQLPlus/MYSQLPlusLib/MResultRes.h	2006-06-12 08:00:09 UTC (rev 326)
@@ -57,8 +57,8 @@
     MYSQL_RES *     pRes;                       /*!< current resultset as per
mysql_use_result() / mysql_store_result()                                         */
     qulonglong      nRow;                       /*!< Current row number where
0=eof/bof. We need to keep track of this due to lack of functionality in client.  */
     QString         stringStatement;            /*!< statement as provided to
doPrepare()                                                                       */
-    QByteArray      bytearrayStatementTemplate; /*!< prepared statement without
parameter markers and parameter data                                            */
-    QVector<int>    vectorParameterMarkers;     /*!< index into
bytearrayStatementTemplate where parameter data is needed                                
      */
+    QStringList     stringlistStatement;        /*!< prepared statement -> no
parameter data but separated based upon parameter markers (if any)                */
+    int             nParameterMarkers;          /*!< number of parameter markers in
prepared statement                                                          */
 
     /* setters */
     SQLRETURN doSeek( qulonglong nRow );

Thread
Connector/ODBC 5 commit: r326 - trunk/MYSQLPlus/MYSQLPlusLibpharvey12 Jun