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/MYSQLPlusLib | pharvey | 12 Jun |