Modified:
trunk/MYODBCDriver/MYODBCDriverLib/SQLGetFunctions.cpp
trunk/MYSQLPlus/MYSQLPlusLib/MDescriptorRecord.cpp
trunk/MYSQLPlus/MYSQLPlusLib/MDescriptorRecord.h
trunk/MYSQLPlus/MYSQLPlusLib/MDescriptorRecordIRD.cpp
trunk/MYSQLPlus/MYSQLPlusLib/MStatement.cpp
Log:
- added support for SQLDescribeParam
Modified: trunk/MYODBCDriver/MYODBCDriverLib/SQLGetFunctions.cpp
===================================================================
--- trunk/MYODBCDriver/MYODBCDriverLib/SQLGetFunctions.cpp 2006-08-08 05:00:43 UTC (rev
477)
+++ trunk/MYODBCDriver/MYODBCDriverLib/SQLGetFunctions.cpp 2006-08-09 23:13:18 UTC (rev
478)
@@ -101,7 +101,7 @@
/* SQL_API_SQLBROWSECONNECT, */
/* SQL_API_SQLCOLATTRIBUTES, Dep */
/* SQL_API_SQLCOLUMNPRIVILEGES, */
-/* SQL_API_SQLDESCRIBEPARAM, */
+ SQL_API_SQLDESCRIBEPARAM,
SQL_API_SQLDRIVERCONNECT,
/* SQL_API_SQLDRIVERS, DM */
/* SQL_API_SQLEXTENDEDFETCH, Dep */
Modified: trunk/MYSQLPlus/MYSQLPlusLib/MDescriptorRecord.cpp
===================================================================
--- trunk/MYSQLPlus/MYSQLPlusLib/MDescriptorRecord.cpp 2006-08-08 05:00:43 UTC (rev 477)
+++ trunk/MYSQLPlus/MYSQLPlusLib/MDescriptorRecord.cpp 2006-08-09 23:13:18 UTC (rev 478)
@@ -1145,6 +1145,82 @@
MYODBCDbgReturn3( "%p", (MDescriptor*)(parent()) );
}
+SQLRETURN MDescriptorRecord::getColumnSizeSQL( SQLUINTEGER *pnColumnSize, SQLSMALLINT
*pnDecimalDigits )
+{
+ MYODBCDbgEnter();
+
+ SQLUINTEGER nColumnSize;
+ SQLSMALLINT nDecimalDigits;
+
+ if ( !pnColumnSize ) pnColumnSize = &nColumnSize;
+ if ( !pnDecimalDigits ) pnDecimalDigits = &nDecimalDigits;
+
+ switch ( getType() )
+ {
+ case SQL_CHAR:
+ case SQL_VARCHAR:
+ case SQL_LONGVARCHAR:
+ case SQL_WCHAR:
+ case SQL_WVARCHAR:
+ case SQL_WLONGVARCHAR:
+ *pnColumnSize = getLength();
+ *pnDecimalDigits = getScale();
+ break;
+ case SQL_DECIMAL:
+ case SQL_NUMERIC:
+ *pnColumnSize = getPrecision();
+ *pnDecimalDigits = getScale();
+ break;
+ case SQL_SMALLINT:
+ case SQL_INTEGER:
+ case SQL_REAL:
+ case SQL_FLOAT:
+ case SQL_DOUBLE:
+ *pnColumnSize = getPrecision();
+ *pnDecimalDigits = getScale();
+ break;
+ case SQL_BIT:
+ *pnColumnSize = getLength();
+ *pnDecimalDigits = 0;
+ break;
+ case SQL_TINYINT:
+ case SQL_BIGINT:
+ *pnColumnSize = getPrecision();
+ *pnDecimalDigits = 0;
+ break;
+ case SQL_BINARY:
+ case SQL_VARBINARY:
+ case SQL_LONGVARBINARY:
+ case SQL_DATETIME:
+ *pnColumnSize = getLength();
+ *pnDecimalDigits = 0;
+ break;
+ case SQL_INTERVAL:
+ switch ( getConciseType() )
+ {
+ case SQL_INTERVAL_SECOND:
+ case SQL_INTERVAL_DAY_TO_SECOND:
+ case SQL_INTERVAL_HOUR_TO_SECOND:
+ case SQL_INTERVAL_MINUTE_TO_SECOND:
+ *pnColumnSize = getLength();
+ *pnDecimalDigits = getPrecision();
+ break;
+ default:
+ *pnColumnSize = getLength();
+ *pnDecimalDigits = 0;
+ break;
+ }
+ case SQL_GUID:
+ *pnColumnSize = getLength();
+ *pnDecimalDigits = 0;
+ break;
+ default:
+ MYODBCDbgReturn( getDescriptor()->getDiagnostic()->doAppend(
MDiagnostic::DIA_HY000, 0, QString( "%1 %2" ).arg( tr("Unexpected SQL type") ).arg(
getType() ) ) );
+ }
+
+ MYODBCDbgReturn( SQL_SUCCESS );
+}
+
SQLINTEGER MDescriptorRecord::getAutoUniqueValue()
{
MYODBCDbgEnter();
Modified: trunk/MYSQLPlus/MYSQLPlusLib/MDescriptorRecord.h
===================================================================
--- trunk/MYSQLPlus/MYSQLPlusLib/MDescriptorRecord.h 2006-08-08 05:00:43 UTC (rev 477)
+++ trunk/MYSQLPlus/MYSQLPlusLib/MDescriptorRecord.h 2006-08-09 23:13:18 UTC (rev 478)
@@ -100,6 +100,8 @@
/* getters */
MDescriptor * getDescriptor();
+ SQLRETURN getColumnSizeSQL( SQLUINTEGER *pnColumnSize, SQLSMALLINT
*pnDecimalDigits );
+
virtual SQLINTEGER getAutoUniqueValue();
virtual QString getBaseColumnName();
virtual QString getBaseTableName();
Modified: trunk/MYSQLPlus/MYSQLPlusLib/MDescriptorRecordIRD.cpp
===================================================================
--- trunk/MYSQLPlus/MYSQLPlusLib/MDescriptorRecordIRD.cpp 2006-08-08 05:00:43 UTC (rev
477)
+++ trunk/MYSQLPlus/MYSQLPlusLib/MDescriptorRecordIRD.cpp 2006-08-09 23:13:18 UTC (rev
478)
@@ -38,76 +38,7 @@
{
MYODBCDbgEnter();
- SQLUINTEGER nColumnSize;
- SQLSMALLINT nDecimalDigits;
-
- if ( !pnColumnSize ) pnColumnSize = &nColumnSize;
- if ( !pnDecimalDigits ) pnDecimalDigits = &nDecimalDigits;
-
- switch ( getType() )
- {
- case SQL_CHAR:
- case SQL_VARCHAR:
- case SQL_LONGVARCHAR:
- case SQL_WCHAR:
- case SQL_WVARCHAR:
- case SQL_WLONGVARCHAR:
- *pnColumnSize = getLength();
- *pnDecimalDigits = getScale();
- break;
- case SQL_DECIMAL:
- case SQL_NUMERIC:
- *pnColumnSize = getPrecision();
- *pnDecimalDigits = getScale();
- break;
- case SQL_SMALLINT:
- case SQL_INTEGER:
- case SQL_REAL:
- case SQL_FLOAT:
- case SQL_DOUBLE:
- *pnColumnSize = getPrecision();
- *pnDecimalDigits = getScale();
- break;
- case SQL_BIT:
- *pnColumnSize = getLength();
- *pnDecimalDigits = 0;
- break;
- case SQL_TINYINT:
- case SQL_BIGINT:
- *pnColumnSize = getPrecision();
- *pnDecimalDigits = 0;
- break;
- case SQL_BINARY:
- case SQL_VARBINARY:
- case SQL_LONGVARBINARY:
- case SQL_DATETIME:
- *pnColumnSize = getLength();
- *pnDecimalDigits = 0;
- break;
- case SQL_INTERVAL:
- switch ( getConciseType() )
- {
- case SQL_INTERVAL_SECOND:
- case SQL_INTERVAL_DAY_TO_SECOND:
- case SQL_INTERVAL_HOUR_TO_SECOND:
- case SQL_INTERVAL_MINUTE_TO_SECOND:
- *pnColumnSize = getLength();
- *pnDecimalDigits = getPrecision();
- break;
- default:
- *pnColumnSize = getLength();
- *pnDecimalDigits = 0;
- break;
- }
- case SQL_GUID:
- *pnColumnSize = getLength();
- *pnDecimalDigits = 0;
- break;
- default:
- MYODBCDbgReturn( getDescriptor()->getDiagnostic()->doAppend(
MDiagnostic::DIA_HY000, 0, QString( "%1 %2" ).arg( tr("Unexpected SQL type") ).arg(
getType() ) ) );
- }
-
- MYODBCDbgReturn( SQL_SUCCESS );
+ MYODBCDbgReturn( getColumnSizeSQL( pnColumnSize, pnDecimalDigits ) );
}
BOOLEAN MDescriptorRecordIRD::isVariableLength( SQLSMALLINT nConciseType )
Modified: trunk/MYSQLPlus/MYSQLPlusLib/MStatement.cpp
===================================================================
--- trunk/MYSQLPlus/MYSQLPlusLib/MStatement.cpp 2006-08-08 05:00:43 UTC (rev 477)
+++ trunk/MYSQLPlus/MYSQLPlusLib/MStatement.cpp 2006-08-09 23:13:18 UTC (rev 478)
@@ -2214,7 +2214,79 @@
*/
pDiagnostic->doClear();
- MYODBCDbgReturn( SQL_ERROR );
+ /*!
+ \internal ODBC RULE (DM)
+
+ The function was called prior to calling SQLPrepare, SQLExecute, or a catalog
function on
+ the statement handle.
+ */
+ if ( !isPrepared() )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+
+ /*!
+ \internal ODBC RULE (DM)
+
+ An asynchronously executing function was called for the
+ StatementHandle and was still executing when this function
+ was called.
+ */
+ if ( isAsyncInProgress() )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+
+ /*!
+ \internal ODBC RULE (DM)
+
+ SQLExecute, SQLExecDirect, SQLBulkOperations, or SQLSetPos was
+ called for the StatementHandle and returned SQL_NEED_DATA.
+ This function was called before data was sent for all
+ data-at-execution parameters or columns.
+ */
+ if ( isDataNeeded() )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+
+ /*!
+ \internal ODBC RULE (DM)
+
+ The value specified for the argument ParameterNumber is less than 1.
+ */
+ if ( nParameterNumber < 1 )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07009 ) );
+
+ /*!
+ \internal ODBC RULE
+
+ The value specified for the argument ParameterNumber was greater than the
+ number of parameters in the associated SQL statement.
+ */
+ MDescriptor *pDescriptor = getImpParamDesc();
+ if ( nParameterNumber > pDescriptor->getCount() )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07009 ) );
+
+ /*!
+ \internal ODBC RULE
+ \todo
+
+ The parameter marker was part of a non-DML statement.
+ */
+
+ /*!
+ \internal ODBC RULE
+ \todo
+
+ The parameter marker was part of a SELECT list.
+ */
+
+
+ /* get info from IPD */
+ MDescriptorRecord *pDescriptorRecord = pDescriptor->getRecord( nParameterNumber );
+
+ if ( pnDataTypePtr )
+ *pnDataTypePtr = pDescriptorRecord->getConciseType();
+
+ if ( pnNullablePtr )
+ *pnNullablePtr = pDescriptorRecord->getNullable();
+
+ MYODBCDbgReturn( pDescriptorRecord->getColumnSizeSQL( pnParameterSizePtr,
pnDecimalDigitsPtr ) );
}
SQLRETURN MStatement::doExecDirect( SQLWCHAR *psStatementText, SQLINTEGER nTextLength )
| Thread |
|---|
| • Connector/ODBC 5 commit: r478 - in trunk: MYODBCDriver/MYODBCDriverLib MYSQLPlus/MYSQLPlusLib | pharvey | 10 Aug |