From: pharvey Date: December 29 2005 7:48pm Subject: Connector/ODBC 5 commit: r22 - MYODBCC/include MYODBCDia/MYODBCDiaLib MYODBCDia/include List-Archive: http://lists.mysql.com/commits/461 Message-Id: <200512291948.jBTJmIZS007131@bk-internal.mysql.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modified: MYODBCC/include/MYODBCC.h MYODBCDia/MYODBCDiaLib/MYODBCDia.cpp MYODBCDia/MYODBCDiaLib/MYODBCDiaLib.pro MYODBCDia/MYODBCDiaLib/MYODBCDiaRecord.cpp MYODBCDia/include/MYODBCDia.h MYODBCDia/include/MYODBCDiaRecord.h Log: UNICODE: - MYODBCDia (diagnostics) library now builds Modified: MYODBCC/include/MYODBCC.h =================================================================== --- MYODBCC/include/MYODBCC.h 2005-12-29 09:54:08 UTC (rev 21) +++ MYODBCC/include/MYODBCC.h 2005-12-29 19:48:18 UTC (rev 22) @@ -154,6 +154,7 @@ #ifdef WIN32 #define MYODBCCfprintf _ftprintf_s #define MYODBCCstrlen wcslen + #define MYODBCCstrncpy wcsncpy_s #else #endif Modified: MYODBCDia/MYODBCDiaLib/MYODBCDia.cpp =================================================================== --- MYODBCDia/MYODBCDiaLib/MYODBCDia.cpp 2005-12-29 09:54:08 UTC (rev 21) +++ MYODBCDia/MYODBCDiaLib/MYODBCDia.cpp 2005-12-29 19:48:18 UTC (rev 22) @@ -104,17 +104,8 @@ \retval SQL_SUCCESS_WITH_INFO Altered value used. \retval SQL_ERROR General error. */ -SQLRETURN MYODBCDia::setField( SQLSMALLINT nRecord /* 1 based */, SQLSMALLINT nField, SQLPOINTER pValue, SQLINTEGER nStringLength ) +SQLRETURN MYODBCDia::setField( SQLSMALLINT /* nRecord */ /* 1 based */, SQLSMALLINT nField, SQLPOINTER pValue, SQLINTEGER /* nStringLength */ ) { - MYODBC_DIA_PTR pDia = (MYODBC_DIA_PTR)hDia; - -#if MYODBC_DEV > 0 - if ( !hDia ) - MYODBCCAssert( "hDia" ); - if ( MYODBCRttiType( hDia ) != MYODBC_RTTI_DIA ) - MYODBCCAssert( "hDia" ); -#endif - /* These are the fields we know about listed by category (header/record) and in _alpha_ order. @@ -130,7 +121,7 @@ return SQL_ERROR; case SQL_DIAG_ROW_COUNT: - pDia->diag_row_count = (SQLINTEGER)pValue; + setRowCount( (SQLINTEGER)pValue ); break; /* RECORD FIELD */ @@ -267,7 +258,7 @@ \sa MYODBCDiaAppend */ -const MYODBCDiaRecord &MYODBCDia::getRecord( SQLSMALLINT nRecord /* 1 based */ ) +MYODBCDiaRecord *MYODBCDia::getRecord( SQLSMALLINT nRecord /* 1 based */ ) { return listRecords.at(nRecord - 1); } @@ -293,16 +284,11 @@ */ SQLRETURN MYODBCDia::getField( SQLSMALLINT nRecord /* 1 based */, SQLSMALLINT nField, SQLPOINTER pBuffer, SQLSMALLINT nBufferLength, SQLSMALLINT *pnStrLenPtr ) { - MYODBC_DIA_PTR pDia = (MYODBC_DIA_PTR)hDia; - MYODBC_DIA_REC_PTR pDiaRec; - SQLSMALLINT nStrLen; + SQLSMALLINT nStrLen; -#if MYODBC_DEV > 0 - if ( !hDia ) - MYODBCCAssert( "hDia" ); - if ( MYODBCRttiType( hDia ) != MYODBC_RTTI_DIA ) - MYODBCCAssert( "hDia" ); -#endif + /* sanity checks */ + if ( nRecord < 1 ) + return SQL_ERROR; /* use dummy when no pnStrLenPtr */ if ( !pnStrLenPtr ) @@ -316,153 +302,57 @@ { /* GET HEADER FIELD */ case SQL_DIAG_CURSOR_ROW_COUNT: - *(SQLINTEGER*)pBuffer = pDia->diag_cursor_row_count; + *(SQLINTEGER*)pBuffer = nCursorRowCount; break; case SQL_DIAG_DYNAMIC_FUNCTION: - if ( !MYODBCCStrCopyOut( (SQLCHAR*)pBuffer, nBufferLength, pDia->diag_dynamic_function, (SQLINTEGER*)pnStrLenPtr ) ) - return SQL_SUCCESS_WITH_INFO; + { + QString stringDynamicFunction = getDynamicFunction(); + if ( nBufferLength < 1 || stringDynamicFunction.isNull() ) + return SQL_ERROR; + + MYODBCCstrncpy( (SQLWCHAR*)pBuffer, nBufferLength / sizeof(SQLWCHAR), stringDynamicFunction.utf16(), _TRUNCATE ); + *pnStrLenPtr = stringDynamicFunction.length() * sizeof(SQLWCHAR); + + if ( *pnStrLenPtr > nBufferLength ) + return SQL_SUCCESS_WITH_INFO; + } break; case SQL_DIAG_DYNAMIC_FUNCTION_CODE: - *(SQLINTEGER*)pBuffer = pDia->diag_dynamic_function_code; + *(SQLINTEGER*)pBuffer = nDynamicFunctionCode; break; case SQL_DIAG_NUMBER: - *(SQLINTEGER*)pBuffer = pDia->diag_number; + *(SQLINTEGER*)pBuffer = getNumber(); break; case SQL_DIAG_RETURNCODE: - *(SQLRETURN*)pBuffer = pDia->diag_returncode; + *(SQLRETURN*)pBuffer = nReturnCode; break; case SQL_DIAG_ROW_COUNT: - *(SQLINTEGER*)pBuffer = pDia->diag_row_count; + *(SQLINTEGER*)pBuffer = nRowCount; break; - /* GET RECORD FIELD */ + /* GET RECORD FIELD */ case SQL_DIAG_CLASS_ORIGIN: - if ( nBufferLength < 0 ) - return SQL_ERROR; - if ( nRecord < 1 ) - return SQL_ERROR; - if ( nRecord > pDia->diag_number ) - return SQL_NO_DATA; - - pDiaRec = MYODBCDiaGet( hDia, nRecord ); - if ( !MYODBCCStrCopyOut( (SQLCHAR*)pBuffer, nBufferLength, pDiaRec->diag_class_origin, (SQLINTEGER*)pnStrLenPtr ) ) - return SQL_SUCCESS_WITH_INFO; - break; - case SQL_DIAG_COLUMN_NUMBER: - if ( nRecord < 1 ) - return SQL_ERROR; - if ( nRecord > pDia->diag_number ) - return SQL_NO_DATA; - - pDiaRec = MYODBCDiaGet( hDia, nRecord ); - *(SQLINTEGER*)pBuffer = pDiaRec->diag_column_number; - break; - case SQL_DIAG_CONNECTION_NAME: - if ( nBufferLength < 0 ) - return SQL_ERROR; - if ( nRecord < 1 ) - return SQL_ERROR; - if ( nRecord > pDia->diag_number ) - return SQL_NO_DATA; - - pDiaRec = MYODBCDiaGet( hDia, nRecord ); - if ( !MYODBCCStrCopyOut( (SQLCHAR*)pBuffer, nBufferLength, pDiaRec->diag_connection_name, (SQLINTEGER*)pnStrLenPtr ) ) - return SQL_SUCCESS_WITH_INFO; - break; - case SQL_DIAG_MESSAGE_TEXT: - if ( nBufferLength < 0 ) - return SQL_ERROR; - if ( nRecord < 1 ) - return SQL_ERROR; - if ( nRecord > pDia->diag_number ) - return SQL_NO_DATA; - - pDiaRec = MYODBCDiaGet( hDia, nRecord ); - if ( !MYODBCCStrCopyOut( (SQLCHAR*)pBuffer, nBufferLength, pDiaRec->diag_message_text, (SQLINTEGER*)pnStrLenPtr ) ) - return SQL_SUCCESS_WITH_INFO; - break; - case SQL_DIAG_NATIVE: - if ( nRecord < 1 ) - return SQL_ERROR; - if ( nRecord > pDia->diag_number ) - return SQL_NO_DATA; - - pDiaRec = MYODBCDiaGet( hDia, nRecord ); - *(SQLINTEGER*)pBuffer = pDiaRec->diag_native; - break; - case SQL_DIAG_ROW_NUMBER: - if ( nRecord < 1 ) - return SQL_ERROR; - if ( nRecord > pDia->diag_number ) - return SQL_NO_DATA; - - pDiaRec = MYODBCDiaGet( hDia, nRecord ); - *(SQLINTEGER*)pBuffer = pDiaRec->diag_row_number; - break; - case SQL_DIAG_SERVER_NAME: - if ( nBufferLength < 0 ) - return SQL_ERROR; - if ( nRecord < 1 ) - return SQL_ERROR; - if ( nRecord > pDia->diag_number ) - return SQL_NO_DATA; - - pDiaRec = MYODBCDiaGet( hDia, nRecord ); - if ( !MYODBCCStrCopyOut( (SQLCHAR*)pBuffer, nBufferLength, pDiaRec->diag_server_name, (SQLINTEGER*)pnStrLenPtr ) ) - return SQL_SUCCESS_WITH_INFO; - break; - case SQL_DIAG_SQLSTATE: - { - SQLINTEGER n; - - if ( nBufferLength < 0 ) - return SQL_ERROR; - if ( nRecord < 1 ) - return SQL_ERROR; - if ( nRecord > pDia->diag_number ) - return SQL_NO_DATA; - - pDiaRec = MYODBCDiaGet( hDia, nRecord ); - if ( !MYODBCCStrCopyOut( (SQLCHAR*)pBuffer, - nBufferLength, - pDiaRec->diag_sqlstate, - &n ) ) - { - *pnStrLenPtr = (SQLSMALLINT)n; - return SQL_SUCCESS_WITH_INFO; - } - *pnStrLenPtr = (SQLSMALLINT)n; - } - break; - case SQL_DIAG_SUBCLASS_ORIGIN: - if ( nBufferLength < 0 ) - return SQL_ERROR; - if ( nRecord < 1 ) - return SQL_ERROR; - if ( nRecord > pDia->diag_number ) + if ( nRecord > listRecords.count() ) return SQL_NO_DATA; + return listRecords[nRecord]->getField( nField, pBuffer, nBufferLength, pnStrLenPtr ); - pDiaRec = MYODBCDiaGet( hDia, nRecord ); - if ( !MYODBCCStrCopyOut( (SQLCHAR*)pBuffer, nBufferLength, pDiaRec->diag_sqlstate, (SQLINTEGER*)pnStrLenPtr ) ) - return SQL_SUCCESS_WITH_INFO; - break; - default: return SQL_ERROR; } + return SQL_SUCCESS; } @@ -522,12 +412,10 @@ SQLRETURN MYODBCDia::doAppend( MYODBC_DIA_ID nState, SQLINTEGER nNative, const QString &stringMessage, SQLINTEGER nRowNumber, SQLINTEGER nColumnNumber ) { /* sanity checks */ - if ( nState >= MYODBC_DIA_MAX ) - MYODBCCAssert( "nState out of range" ); + Q_ASSERT( nState >= MYODBC_DIA_MAX ); - MYODBCDiaRecord pdiarecord = new MYODBCDiaRecord( this, nState ); - pdiarecord->setConnectionName( "unknown connection name" ); /*! \todo get real connection name */ - pdiarecord->setServerName( "unknown server name" ); /*! \todo get real server name */ + MYODBCDiaRecord *pdiarecord = new MYODBCDiaRecord( this, nState ); + pdiarecord->setNative( nNative ); pdiarecord->setColumnNumber( nColumnNumber ); pdiarecord->setRowNumber( nRowNumber ); pdiarecord->setMessage( stringMessage ); @@ -547,7 +435,7 @@ \sa MYODBCDiaAlloc MYODBCDiaFree */ -void MYODBCDia::clear() +void MYODBCDia::doClear() { /* delete any records we may have */ while (!listRecords.isEmpty()) @@ -592,6 +480,8 @@ return false; delete listRecords[nRecord - 1]; + + return true; } /*! @@ -611,7 +501,7 @@ stream << "SQL_DIAG_RETURNCODE : " << rval.nReturnCode << endl; stream << "SQL_DIAG_ROW_COUNT : " << rval.nRowCount << endl; - QListIterator i( listRecords ); + QListIterator i( rval.listRecords ); while ( i.hasNext() ) { stream << "Record..." << endl; Modified: MYODBCDia/MYODBCDiaLib/MYODBCDiaLib.pro =================================================================== --- MYODBCDia/MYODBCDiaLib/MYODBCDiaLib.pro 2005-12-29 09:54:08 UTC (rev 21) +++ MYODBCDia/MYODBCDiaLib/MYODBCDiaLib.pro 2005-12-29 19:48:18 UTC (rev 22) @@ -39,6 +39,6 @@ MYODBCDiaInternal.h SOURCES = \ - MYODBCDia.cpp \ + MYODBCDia.cpp \ MYODBCDiaRecord.cpp Modified: MYODBCDia/MYODBCDiaLib/MYODBCDiaRecord.cpp =================================================================== --- MYODBCDia/MYODBCDiaLib/MYODBCDiaRecord.cpp 2005-12-29 09:54:08 UTC (rev 21) +++ MYODBCDia/MYODBCDiaLib/MYODBCDiaRecord.cpp 2005-12-29 19:48:18 UTC (rev 22) @@ -212,10 +212,6 @@ return true; } -SQLRETURN MYODBCDiaRecord::setField( SQLSMALLINT nField, SQLPOINTER pValue, SQLINTEGER nStringLength ) -{ -} - QString MYODBCDiaRecord::getClassOrigin() { return MYODBCDia_pStates[nState].diag_class_origin; @@ -234,7 +230,7 @@ QString MYODBCDiaRecord::getMessageText() { /* this message formated according to odbc spec */ - if ( diag_native ) + if ( nNative ) { /* server message */ if ( stringMessage.isEmpty() ) @@ -311,6 +307,118 @@ return pdiaOwner; } +SQLRETURN MYODBCDiaRecord::getField( SQLSMALLINT nField, SQLPOINTER pBuffer, SQLSMALLINT nBufferLength, SQLSMALLINT *pnStrLenPtr ) +{ + SQLSMALLINT nStrLen; + + /* use dummy when no pnStrLenPtr */ + if ( !pnStrLenPtr ) + pnStrLenPtr = &nStrLen; + + /* which record field? */ + switch ( nField ) + { + case SQL_DIAG_CLASS_ORIGIN: + { + QString stringClassOrigin = getClassOrigin(); + if ( nBufferLength < 1 || stringClassOrigin.isNull() ) + return SQL_ERROR; + + MYODBCCstrncpy( (SQLWCHAR*)pBuffer, nBufferLength / sizeof(SQLWCHAR), stringClassOrigin.utf16(), _TRUNCATE ); + *pnStrLenPtr = stringClassOrigin.length() * sizeof(SQLWCHAR); + + if ( *pnStrLenPtr > nBufferLength ) + return SQL_SUCCESS_WITH_INFO; + } + break; + + case SQL_DIAG_COLUMN_NUMBER: + *(SQLINTEGER*)pBuffer = nColumnNumber; + break; + + case SQL_DIAG_CONNECTION_NAME: + { + if ( nBufferLength < 1 || stringConnectionName.isNull() ) + return SQL_ERROR; + + MYODBCCstrncpy( (SQLWCHAR*)pBuffer, nBufferLength / sizeof(SQLWCHAR), stringConnectionName.utf16(), _TRUNCATE ); + *pnStrLenPtr = stringConnectionName.length() * sizeof(SQLWCHAR); + + if ( *pnStrLenPtr > nBufferLength ) + return SQL_SUCCESS_WITH_INFO; + } + break; + + case SQL_DIAG_MESSAGE_TEXT: + { + QString stringMessageText = getMessageText(); + if ( nBufferLength < 1 || stringMessageText.isNull() ) + return SQL_ERROR; + + MYODBCCstrncpy( (SQLWCHAR*)pBuffer, nBufferLength / sizeof(SQLWCHAR), stringMessageText.utf16(), _TRUNCATE ); + *pnStrLenPtr = stringMessageText.length() * sizeof(SQLWCHAR); + + if ( *pnStrLenPtr > nBufferLength ) + return SQL_SUCCESS_WITH_INFO; + } + break; + + case SQL_DIAG_NATIVE: + *(SQLINTEGER*)pBuffer = nNative; + break; + + case SQL_DIAG_ROW_NUMBER: + *(SQLINTEGER*)pBuffer = nRowNumber; + break; + + case SQL_DIAG_SERVER_NAME: + { + if ( nBufferLength < 1 || stringServerName.isNull() ) + return SQL_ERROR; + + MYODBCCstrncpy( (SQLWCHAR*)pBuffer, nBufferLength / sizeof(SQLWCHAR), stringServerName.utf16(), _TRUNCATE ); + *pnStrLenPtr = stringServerName.length() * sizeof(SQLWCHAR); + + if ( *pnStrLenPtr > nBufferLength ) + return SQL_SUCCESS_WITH_INFO; + } + break; + + case SQL_DIAG_SQLSTATE: + { + QString stringSQLState = getSQLState(); + if ( nBufferLength < 1 || stringSQLState.isNull() ) + return SQL_ERROR; + + MYODBCCstrncpy( (SQLWCHAR*)pBuffer, nBufferLength / sizeof(SQLWCHAR), stringSQLState.utf16(), _TRUNCATE ); + *pnStrLenPtr = stringSQLState.length() * sizeof(SQLWCHAR); + + if ( *pnStrLenPtr > nBufferLength ) + return SQL_SUCCESS_WITH_INFO; + } + break; + + case SQL_DIAG_SUBCLASS_ORIGIN: + { + QString stringSubClassOrigin = getSubClassOrigin(); + if ( nBufferLength < 1 || stringSubClassOrigin.isNull() ) + return SQL_ERROR; + + MYODBCCstrncpy( (SQLWCHAR*)pBuffer, nBufferLength / sizeof(SQLWCHAR), stringSubClassOrigin.utf16(), _TRUNCATE ); + *pnStrLenPtr = stringSubClassOrigin.length() * sizeof(SQLWCHAR); + + if ( *pnStrLenPtr > nBufferLength ) + return SQL_SUCCESS_WITH_INFO; + } + break; + + default: + return SQL_ERROR; + } + + return SQL_SUCCESS; +} + /*! \internal \brief Dumps the contents to stream. @@ -321,20 +429,17 @@ */ QTextStream &operator<<( QTextStream &stream, const MYODBCDiaRecord &rval ) { - stream << "SQL_DIAG_CLASS_ORIGIN : " << rval.MYODBCDia_pStates[nState].diag_class_origin << endl; + stream << "SQL_DIAG_CLASS_ORIGIN : " << MYODBCDia_pStates[rval.nState].diag_class_origin << endl; stream << "SQL_DIAG_COLUMN_NUMBER : " << rval.nColumnNumber << endl; stream << "SQL_DIAG_CONNECTION_NAME : " << rval.stringConnectionName << endl; stream << "SQL_DIAG_MESSAGE_TEXT : " << rval.stringMessage << endl; stream << "SQL_DIAG_NATIVE : " << rval.nNative << endl; stream << "SQL_DIAG_ROW_NUMBER : " << rval.nRowNumber << endl; stream << "SQL_DIAG_SERVER_NAME : " << rval.stringServerName << endl; - stream << "SQL_DIAG_SQLSTATE : " << rval.MYODBCDia_pStates[nState].diag_sqlstate << endl; - stream << "SQL_DIAG_SUBCLASS_ORIGIN : " << rval.MYODBCDia_pStates[nState].diag_class_origin << endl; + stream << "SQL_DIAG_SQLSTATE : " << MYODBCDia_pStates[rval.nState].diag_sqlstate << endl; + stream << "SQL_DIAG_SUBCLASS_ORIGIN : " << MYODBCDia_pStates[rval.nState].diag_class_origin << endl; return stream; } -SQLRETURN MYODBCDiaRecord::getField( SQLSMALLINT nField, SQLPOINTER pBuffer, SQLSMALLINT nBufferLength, SQLSMALLINT *pnStrLenPtr ) -{ -} Modified: MYODBCDia/include/MYODBCDia.h =================================================================== --- MYODBCDia/include/MYODBCDia.h 2005-12-29 09:54:08 UTC (rev 21) +++ MYODBCDia/include/MYODBCDia.h 2005-12-29 19:48:18 UTC (rev 22) @@ -28,6 +28,14 @@ #ifndef MYODBC_DIA_H #define MYODBC_DIA_H +#include +#include + +#include +#include +#include +#include + #include "MYODBCDiaRecord.h" /*! @@ -62,7 +70,7 @@ SQLINTEGER getRowCount(); QString getConnectionName(); QString getServerName(); - const MYODBCDiaRecord &getRecord( SQLSMALLINT nRecord /* 1 based */ ); + MYODBCDiaRecord *getRecord( SQLSMALLINT nRecord /* 1 based */ ); SQLRETURN getField( SQLSMALLINT nRecord /* 1 based */, SQLSMALLINT nField, SQLPOINTER pBuffer, SQLSMALLINT nBufferLength, SQLSMALLINT *pnStrLenPtr ); SQLRETURN doAppend( MYODBC_DIA_ID nState, SQLINTEGER nNative, const QString &stringMessage ); @@ -72,16 +80,15 @@ protected: SQLINTEGER nCursorRowCount; /*!< Count of rows in the cursor. */ -/* SQLCHAR * diag_dynamic_function; */ SQLINTEGER nDynamicFunctionCode; /*!< Code indicating type of SQL executed (ie SQL_DIAG_UPDATE_WHERE) */ SQLRETURN nReturnCode; /*!< Return code (as in SQLRETURN) returned by the function. */ SQLINTEGER nRowCount; /*!< The number of rows affected by an insert, delete, or update. */ /* these values are copied by new records */ - QString stringConnectionName; /*!< This is dbc->server. */ - Qstring stringServerName; /*!< This is dbc->dsn. Same as SQL_DATA_SOURCE_NAME in SQLGetInfo(). */ + QString stringConnectionName; /*!< This is dbc->server. */ + QString stringServerName; /*!< This is dbc->dsn. Same as SQL_DATA_SOURCE_NAME in SQLGetInfo(). */ - QList listRecords;/*!< the records we own */ + QList listRecords;/*!< the records we own */ }; Modified: MYODBCDia/include/MYODBCDiaRecord.h =================================================================== --- MYODBCDia/include/MYODBCDiaRecord.h 2005-12-29 09:54:08 UTC (rev 21) +++ MYODBCDia/include/MYODBCDiaRecord.h 2005-12-29 19:48:18 UTC (rev 22) @@ -208,7 +208,6 @@ bool setMessage( const QString &stringMessage ); bool setNative( SQLINTEGER nNative ); bool setRowNumber( SQLINTEGER nRowNumber ); - SQLRETURN setField( SQLSMALLINT nField, SQLPOINTER pValue, SQLINTEGER nStringLength ); QString getClassOrigin(); /*!< Doc that defines the class portion of the SQLSTATE val in this rec. */ SQLINTEGER getColumnNumber();