http://git-wip-us.apache.org/repos/asf/kylin/blob/3c2329dc/odbc/Driver/KO_DIAG.CPP ---------------------------------------------------------------------- diff --git a/odbc/Driver/KO_DIAG.CPP b/odbc/Driver/KO_DIAG.CPP index a74dd9d..e296335 100644 --- a/odbc/Driver/KO_DIAG.CPP +++ b/odbc/Driver/KO_DIAG.CPP @@ -15,7 +15,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - + // ---------------------------------------------------------------------------- // @@ -65,441 +65,573 @@ #include <stdarg.h> - - - // --------------------- local functions --------------------------------- -static pODBCDiagRow _SQLGetDiagRowX ( pODBCDiag pHandle, Word pRowNum ); -static pODBCDiag _SQLGetDiagHandle ( SQLSMALLINT pHandleType, SQLHANDLE pHandle ); +static pODBCDiagRow _SQLGetDiagRowX ( pODBCDiag pHandle, Word pRowNum ); +static pODBCDiag _SQLGetDiagHandle ( SQLSMALLINT pHandleType, SQLHANDLE pHandle ); // --------------------- local functions --------------------------------- -static LogLevel currentLogLevel = - LogLevel_INFO;// Global variable to be set at the begining of pragram starts +static LogLevel currentLogLevel = +LogLevel_INFO;// Global variable to be set at the begining of pragram starts // ----------------------------------------------------------------------- // to get a specified field from the specified diag row // ----------------------------------------------------------------------- -RETCODE SQL_API SQLGetDiagFieldW ( SQLSMALLINT pHandleType, - SQLHANDLE pHandle, - SQLSMALLINT pRecNum, - SQLSMALLINT pFldID, - SQLPOINTER pDataPtr, - SQLSMALLINT pDataSize, - SQLSMALLINT* pDataSizePtr ) { +RETCODE SQL_API SQLGetDiagFieldW ( SQLSMALLINT pHandleType, + SQLHANDLE pHandle, + SQLSMALLINT pRecNum, + SQLSMALLINT pFldID, + SQLPOINTER pDataPtr, + SQLSMALLINT pDataSize, + SQLSMALLINT* pDataSizePtr ) +{ __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, - "SQLGetDiagFieldW called, HandleType: %d, RecNum: %d, InfoType: %d, BufLen: %d", pHandleType, pRecNum, pFldID, - pDataSize ) ); - bool c; - pODBCDiag diag; + "SQLGetDiagFieldW called, HandleType: %d, RecNum: %d, InfoType: %d, BufLen: %d", pHandleType, pRecNum, pFldID, + pDataSize ) ); + bool c; + pODBCDiag diag; pODBCDiagRow diagrow; SQLSMALLINT dummySize = 0;//used when pDataSizePtr is NULL - + if ( pDataSizePtr == NULL ) - { pDataSizePtr = &dummySize; } - + { + pDataSizePtr = &dummySize; + } + __CHK_HANDLE ( pHandle, pHandleType, SQL_ERROR ); diag = _SQLGetDiagHandle ( pHandleType, pHandle ); - - if ( !diag ) { return SQL_ERROR; } - + + if ( !diag ) + { + return SQL_ERROR; + } + // field may be in diag header c = FALSE; - + // check the field type - header fields - switch ( pFldID ) { - case SQL_DIAG_CURSOR_ROW_COUNT: - case SQL_DIAG_ROW_COUNT: // rows affected by update/insert - if ( pHandleType == SQL_HANDLE_STMT ) { + switch ( pFldID ) + { + case SQL_DIAG_CURSOR_ROW_COUNT : + case SQL_DIAG_ROW_COUNT : // rows affected by update/insert + if ( pHandleType == SQL_HANDLE_STMT ) + { if ( pDataPtr ) - { * ( ( SQLLEN* ) pDataPtr ) = ( pHandle ) ? ( ( pODBCStmt ) pHandle )->RowCount : 0; } - + { + * ( ( SQLLEN* ) pDataPtr ) = ( pHandle ) ? ( ( pODBCStmt ) pHandle ) -> RowCount : 0; + } + return SQL_SUCCESS; } - + else - { return SQL_ERROR; } - - case SQL_DIAG_DYNAMIC_FUNCTION: - if ( pHandleType == SQL_HANDLE_STMT ) { - _SQLCopyWCharDataW ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, ( ( pODBCStmt ) pHandle )->Stmt, - ( ( pODBCStmt ) pHandle )->StmtLen ); + { + return SQL_ERROR; + } + + case SQL_DIAG_DYNAMIC_FUNCTION : + if ( pHandleType == SQL_HANDLE_STMT ) + { + _SQLCopyWCharDataW ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, ( ( pODBCStmt ) pHandle ) -> Stmt, + ( ( pODBCStmt ) pHandle ) -> StmtLen ); return SQL_SUCCESS; } - + else - { return SQL_ERROR; } - + { + return SQL_ERROR; + } + return SQL_ERROR; - - case SQL_DIAG_DYNAMIC_FUNCTION_CODE: - if ( pHandleType == SQL_HANDLE_STMT ) { + + case SQL_DIAG_DYNAMIC_FUNCTION_CODE : + if ( pHandleType == SQL_HANDLE_STMT ) + { if ( pDataPtr ) - { * ( ( StrPtr ) pDataPtr ) = 1; } // ??? debug test only - - _SQLCopyWCharDataW ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, ( ( pODBCStmt ) pHandle )->Stmt, - ( ( ( pODBCStmt ) pHandle )->StmtLen ) ); + { + * ( ( StrPtr ) pDataPtr ) = 1; + } // ??? debug test only + + _SQLCopyWCharDataW ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, ( ( pODBCStmt ) pHandle ) -> Stmt, + ( ( ( pODBCStmt ) pHandle ) -> StmtLen ) ); return SQL_SUCCESS; } - + else - { return SQL_ERROR; } - - case SQL_DIAG_NUMBER: { // number of rows in diag - Word i; - - // check if there r any diag rows - if ( diag->DiagRows ) { - // loop to count the rows - for ( i = 1, diagrow = diag->DiagRows; diagrow != NULL; diagrow = diagrow->Next, i ++ ); - - if ( pDataPtr ) { * ( ( Word* ) pDataPtr ) = i; } + { + return SQL_ERROR; + } + + case SQL_DIAG_NUMBER : + { // number of rows in diag + Word i; + + // check if there r any diag rows + if ( diag -> DiagRows ) + { + // loop to count the rows + for ( i = 1 , diagrow = diag -> DiagRows; diagrow != NULL; diagrow = diagrow -> Next , i ++ ); + + if ( pDataPtr ) + { + * ( ( Word* ) pDataPtr ) = i; } - - else if ( pDataPtr ) { * ( ( Word* ) pDataPtr ) = 0; } - - return SQL_SUCCESS; } + + else if ( pDataPtr ) + { + * ( ( Word* ) pDataPtr ) = 0; + } + + return SQL_SUCCESS; + } break; - - default: + + default : c = TRUE; } - + // check if only a header field was required if ( c == FALSE ) - { return SQL_SUCCESS; } - + { + return SQL_SUCCESS; + } + // check row and buffer - if ( pRecNum <= 0 || pDataSize < 0 ) { + if ( pRecNum <= 0 || pDataSize < 0 ) + { __ODBCPOPMSG ( _ODBCPopMsg ( "GetDiagField xxx1" ) ); return SQL_ERROR; } - + // now get the desired row first if ( ( diagrow = _SQLGetDiagRowX ( diag, pRecNum ) ) == NULL ) - { return SQL_NO_DATA; } - + { + return SQL_NO_DATA; + } + // now set info as per the field required - switch ( pFldID ) { - case SQL_DIAG_CLASS_ORIGIN: + switch ( pFldID ) + { + case SQL_DIAG_CLASS_ORIGIN : _SQLCopyWCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, "ODBC 3.0", -1 ); break; - - case SQL_DIAG_COLUMN_NUMBER: - + + case SQL_DIAG_COLUMN_NUMBER : + // needs to be implemented - if ( pDataPtr ) { * ( ( Long* ) pDataPtr ) = diagrow->Col; } - + if ( pDataPtr ) + { + * ( ( Long* ) pDataPtr ) = diagrow -> Col; + } + break; - - case SQL_DIAG_CONNECTION_NAME: - if ( pDataPtr ) { * ( ( char* ) pDataPtr ) = 0; } - - if ( pDataSizePtr ) { *pDataSizePtr = 0; } - + + case SQL_DIAG_CONNECTION_NAME : + if ( pDataPtr ) + { + * ( ( char* ) pDataPtr ) = 0; + } + + if ( pDataSizePtr ) + { + *pDataSizePtr = 0; + } + break; - - case SQL_DIAG_MESSAGE_TEXT: - return _SQLCopyWCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, diagrow->Msg, -1 ); - - case SQL_DIAG_NATIVE: - if ( pDataPtr ) { * ( ( Long* ) pDataPtr ) = diagrow->NativeErrorCode; } - - if ( pDataSizePtr ) { *pDataSizePtr = 0; } - + + case SQL_DIAG_MESSAGE_TEXT : + return _SQLCopyWCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, diagrow -> Msg, -1 ); + + case SQL_DIAG_NATIVE : + if ( pDataPtr ) + { + * ( ( Long* ) pDataPtr ) = diagrow -> NativeErrorCode; + } + + if ( pDataSizePtr ) + { + *pDataSizePtr = 0; + } + break; - - case SQL_DIAG_ROW_NUMBER: - + + case SQL_DIAG_ROW_NUMBER : + // needs to be implemented - if ( pDataPtr ) { * ( ( Long* ) pDataPtr ) = diagrow->Row; } - + if ( pDataPtr ) + { + * ( ( Long* ) pDataPtr ) = diagrow -> Row; + } + break; - - case SQL_DIAG_SERVER_NAME: { - CStrPtr svr; - - // if handle type is connection - if ( pHandleType == SQL_HANDLE_DBC ) - { svr = ( ( pODBCConn ) pHandle )->Server; } - - else if ( pHandleType == SQL_HANDLE_STMT && ( ( pODBCStmt ) pHandle )->Conn ) - { svr = ( ( pODBCStmt ) pHandle )->Conn->Server; } - - else - { svr = ""; } - - return _SQLCopyWCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, svr, -1 ); - } - - case SQL_DIAG_SQLSTATE: - return _SQLCopyWCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, diagrow->State, -1 ); - - case SQL_DIAG_SUBCLASS_ORIGIN: + + case SQL_DIAG_SERVER_NAME : + { + CStrPtr svr; + + // if handle type is connection + if ( pHandleType == SQL_HANDLE_DBC ) + { + svr = ( ( pODBCConn ) pHandle ) -> Server; + } + + else if ( pHandleType == SQL_HANDLE_STMT && ( ( pODBCStmt ) pHandle ) -> Conn ) + { + svr = ( ( pODBCStmt ) pHandle ) -> Conn -> Server; + } + + else + { + svr = ""; + } + + return _SQLCopyWCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, svr, -1 ); + } + + case SQL_DIAG_SQLSTATE : + return _SQLCopyWCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, diagrow -> State, -1 ); + + case SQL_DIAG_SUBCLASS_ORIGIN : // ??? dummy - return _SQLCopyWCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, diagrow->State, -1 ); - - default: + return _SQLCopyWCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, diagrow -> State, -1 ); + + default : __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetDiagField called, HandleType: %d, RecNum: %d, InfoType: %d, BufLen: %d", - pHandleType, pRecNum, pFldID, pDataSize ) ); + pHandleType, pRecNum, pFldID, pDataSize ) ); return SQL_ERROR; } - + return SQL_SUCCESS; } -RETCODE SQL_API SQLGetDiagField ( SQLSMALLINT pHandleType, - SQLHANDLE pHandle, - SQLSMALLINT pRecNum, - SQLSMALLINT pFldID, - SQLPOINTER pDataPtr, - SQLSMALLINT pDataSize, - SQLSMALLINT* pDataSizePtr ) { +RETCODE SQL_API SQLGetDiagField ( SQLSMALLINT pHandleType, + SQLHANDLE pHandle, + SQLSMALLINT pRecNum, + SQLSMALLINT pFldID, + SQLPOINTER pDataPtr, + SQLSMALLINT pDataSize, + SQLSMALLINT* pDataSizePtr ) +{ __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, - "SQLGetDiagField called, HandleType: %d, RecNum: %d, InfoType: %d, BufLen: %d", pHandleType, pRecNum, pFldID, - pDataSize ) ); - bool c; - pODBCDiag diag; + "SQLGetDiagField called, HandleType: %d, RecNum: %d, InfoType: %d, BufLen: %d", pHandleType, pRecNum, pFldID, + pDataSize ) ); + bool c; + pODBCDiag diag; pODBCDiagRow diagrow; SQLSMALLINT dummySize = 0;//used when pDataSizePtr is NULL - + if ( pDataSizePtr == NULL ) - { pDataSizePtr = &dummySize; } - + { + pDataSizePtr = &dummySize; + } + __CHK_HANDLE ( pHandle, pHandleType, SQL_ERROR ); diag = _SQLGetDiagHandle ( pHandleType, pHandle ); - - if ( !diag ) { return SQL_ERROR; } - + + if ( !diag ) + { + return SQL_ERROR; + } + // field may be in diag header c = FALSE; - + // check the field type - header fields - switch ( pFldID ) { - case SQL_DIAG_CURSOR_ROW_COUNT: - case SQL_DIAG_ROW_COUNT: // rows affected by update/insert - if ( pHandleType == SQL_HANDLE_STMT ) { + switch ( pFldID ) + { + case SQL_DIAG_CURSOR_ROW_COUNT : + case SQL_DIAG_ROW_COUNT : // rows affected by update/insert + if ( pHandleType == SQL_HANDLE_STMT ) + { if ( pDataPtr ) - { * ( ( SQLLEN* ) pDataPtr ) = ( pHandle ) ? ( ( pODBCStmt ) pHandle )->RowCount : 0; } - + { + * ( ( SQLLEN* ) pDataPtr ) = ( pHandle ) ? ( ( pODBCStmt ) pHandle ) -> RowCount : 0; + } + return SQL_SUCCESS; } - + else - { return SQL_ERROR; } - - case SQL_DIAG_DYNAMIC_FUNCTION: - if ( pHandleType == SQL_HANDLE_STMT ) { - unique_ptr<char[]> p ( wchar2char ( ( ( pODBCStmt ) pHandle )->Stmt ) ); - _SQLCopyCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, p.get(), ( ( pODBCStmt ) pHandle )->StmtLen ); + { + return SQL_ERROR; + } + + case SQL_DIAG_DYNAMIC_FUNCTION : + if ( pHandleType == SQL_HANDLE_STMT ) + { + unique_ptr <char[]> p ( wchar2char ( ( ( pODBCStmt ) pHandle ) -> Stmt ) ); + _SQLCopyCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, p . get (), ( ( pODBCStmt ) pHandle ) -> StmtLen ); return SQL_SUCCESS; } - + else - { return SQL_ERROR; } - + { + return SQL_ERROR; + } + return SQL_ERROR; - - case SQL_DIAG_DYNAMIC_FUNCTION_CODE: - if ( pHandleType == SQL_HANDLE_STMT ) { + + case SQL_DIAG_DYNAMIC_FUNCTION_CODE : + if ( pHandleType == SQL_HANDLE_STMT ) + { if ( pDataPtr ) - { * ( ( StrPtr ) pDataPtr ) = 1; } // ??? debug test only - - unique_ptr<char[]> p ( wchar2char ( ( ( pODBCStmt ) pHandle )->Stmt ) ); - _SQLCopyCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, p.get(), ( ( ( pODBCStmt ) pHandle )->StmtLen ) ); + { + * ( ( StrPtr ) pDataPtr ) = 1; + } // ??? debug test only + + unique_ptr <char[]> p ( wchar2char ( ( ( pODBCStmt ) pHandle ) -> Stmt ) ); + _SQLCopyCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, p . get (), ( ( ( pODBCStmt ) pHandle ) -> StmtLen ) ); return SQL_SUCCESS; } - + else - { return SQL_ERROR; } - - case SQL_DIAG_NUMBER: { // number of rows in diag - Word i; - - // check if there r any diag rows - if ( diag->DiagRows ) { - // loop to count the rows - for ( i = 1, diagrow = diag->DiagRows; diagrow != NULL; diagrow = diagrow->Next, i ++ ); - - if ( pDataPtr ) { * ( ( Word* ) pDataPtr ) = i; } + { + return SQL_ERROR; + } + + case SQL_DIAG_NUMBER : + { // number of rows in diag + Word i; + + // check if there r any diag rows + if ( diag -> DiagRows ) + { + // loop to count the rows + for ( i = 1 , diagrow = diag -> DiagRows; diagrow != NULL; diagrow = diagrow -> Next , i ++ ); + + if ( pDataPtr ) + { + * ( ( Word* ) pDataPtr ) = i; } - - else if ( pDataPtr ) { * ( ( Word* ) pDataPtr ) = 0; } - - return SQL_SUCCESS; } + + else if ( pDataPtr ) + { + * ( ( Word* ) pDataPtr ) = 0; + } + + return SQL_SUCCESS; + } break; - - default: + + default : c = TRUE; } - + // check if only a header field was required if ( c == FALSE ) - { return SQL_SUCCESS; } - + { + return SQL_SUCCESS; + } + // check row and buffer - if ( pRecNum <= 0 || pDataSize < 0 ) { + if ( pRecNum <= 0 || pDataSize < 0 ) + { __ODBCPOPMSG ( _ODBCPopMsg ( "GetDiagField xxx1" ) ); return SQL_ERROR; } - + // now get the desired row first if ( ( diagrow = _SQLGetDiagRowX ( diag, pRecNum ) ) == NULL ) - { return SQL_NO_DATA; } - + { + return SQL_NO_DATA; + } + // now set info as per the field required - switch ( pFldID ) { - case SQL_DIAG_CLASS_ORIGIN: + switch ( pFldID ) + { + case SQL_DIAG_CLASS_ORIGIN : _SQLCopyCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, "ODBC 3.0", -1 ); break; - - case SQL_DIAG_COLUMN_NUMBER: - + + case SQL_DIAG_COLUMN_NUMBER : + // needs to be implemented - if ( pDataPtr ) { * ( ( Long* ) pDataPtr ) = diagrow->Col; } - + if ( pDataPtr ) + { + * ( ( Long* ) pDataPtr ) = diagrow -> Col; + } + break; - - case SQL_DIAG_CONNECTION_NAME: - if ( pDataPtr ) { * ( ( char* ) pDataPtr ) = 0; } - - if ( pDataSizePtr ) { *pDataSizePtr = 0; } - + + case SQL_DIAG_CONNECTION_NAME : + if ( pDataPtr ) + { + * ( ( char* ) pDataPtr ) = 0; + } + + if ( pDataSizePtr ) + { + *pDataSizePtr = 0; + } + break; - - case SQL_DIAG_MESSAGE_TEXT: - return _SQLCopyCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, diagrow->Msg, -1 ); - - case SQL_DIAG_NATIVE: - if ( pDataPtr ) { * ( ( Long* ) pDataPtr ) = diagrow->NativeErrorCode; } - - if ( pDataSizePtr ) { *pDataSizePtr = 0; } - + + case SQL_DIAG_MESSAGE_TEXT : + return _SQLCopyCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, diagrow -> Msg, -1 ); + + case SQL_DIAG_NATIVE : + if ( pDataPtr ) + { + * ( ( Long* ) pDataPtr ) = diagrow -> NativeErrorCode; + } + + if ( pDataSizePtr ) + { + *pDataSizePtr = 0; + } + break; - - case SQL_DIAG_ROW_NUMBER: - + + case SQL_DIAG_ROW_NUMBER : + // needs to be implemented - if ( pDataPtr ) { * ( ( Long* ) pDataPtr ) = diagrow->Row; } - + if ( pDataPtr ) + { + * ( ( Long* ) pDataPtr ) = diagrow -> Row; + } + break; - - case SQL_DIAG_SERVER_NAME: { - CStrPtr svr; - - // if handle type is connection - if ( pHandleType == SQL_HANDLE_DBC ) - { svr = ( ( pODBCConn ) pHandle )->Server; } - - else if ( pHandleType == SQL_HANDLE_STMT && ( ( pODBCStmt ) pHandle )->Conn ) - { svr = ( ( pODBCStmt ) pHandle )->Conn->Server; } - - else - { svr = ""; } - - return _SQLCopyCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, svr, -1 ); - } - - case SQL_DIAG_SQLSTATE: - return _SQLCopyCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, diagrow->State, -1 ); - - case SQL_DIAG_SUBCLASS_ORIGIN: + + case SQL_DIAG_SERVER_NAME : + { + CStrPtr svr; + + // if handle type is connection + if ( pHandleType == SQL_HANDLE_DBC ) + { + svr = ( ( pODBCConn ) pHandle ) -> Server; + } + + else if ( pHandleType == SQL_HANDLE_STMT && ( ( pODBCStmt ) pHandle ) -> Conn ) + { + svr = ( ( pODBCStmt ) pHandle ) -> Conn -> Server; + } + + else + { + svr = ""; + } + + return _SQLCopyCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, svr, -1 ); + } + + case SQL_DIAG_SQLSTATE : + return _SQLCopyCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, diagrow -> State, -1 ); + + case SQL_DIAG_SUBCLASS_ORIGIN : // ??? dummy - return _SQLCopyCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, diagrow->State, -1 ); - - default: + return _SQLCopyCharData ( diag, pDataPtr, pDataSize, pDataSizePtr, 16, diagrow -> State, -1 ); + + default : __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetDiagField called, HandleType: %d, RecNum: %d, InfoType: %d, BufLen: %d", - pHandleType, pRecNum, pFldID, pDataSize ) ); + pHandleType, pRecNum, pFldID, pDataSize ) ); return SQL_ERROR; } - + return SQL_SUCCESS; } -RETCODE SQL_API SQLGetDiagRecW ( SQLSMALLINT pHandleType, - SQLHANDLE pHandle, - SQLSMALLINT pRecNum, - SQLWCHAR* pSqlstate, - SQLINTEGER* pNativeErrorPtr, - SQLWCHAR* pMsgTxtPtr, - SQLSMALLINT pMsgTxtSize, - SQLSMALLINT* pMsgTxtSizePtr ) { +RETCODE SQL_API SQLGetDiagRecW ( SQLSMALLINT pHandleType, + SQLHANDLE pHandle, + SQLSMALLINT pRecNum, + SQLWCHAR* pSqlstate, + SQLINTEGER* pNativeErrorPtr, + SQLWCHAR* pMsgTxtPtr, + SQLSMALLINT pMsgTxtSize, + SQLSMALLINT* pMsgTxtSizePtr ) +{ __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetDiagRecW called, HandleType: %d, RecNum: %d, BufLen: %d", pHandleType, - pRecNum, pMsgTxtSize ) ); - pODBCDiag diag; + pRecNum, pMsgTxtSize ) ); + pODBCDiag diag; pODBCDiagRow diagrow; __CHK_HANDLE ( pHandle, pHandleType, SQL_ERROR ); diag = _SQLGetDiagHandle ( pHandleType, pHandle ); - - if ( !diag ) { return SQL_ERROR; } - + + if ( !diag ) + { + return SQL_ERROR; + } + // now get the desired diag row - if ( ( diagrow = _SQLGetDiagRowX ( diag, pRecNum ) ) == NULL ) { + if ( ( diagrow = _SQLGetDiagRowX ( diag, pRecNum ) ) == NULL ) + { __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "sql no data" ) ); return SQL_NO_DATA; } - + // sql-state - if ( pSqlstate ) { - char2wchar ( diagrow->State, pSqlstate, -1 ); + if ( pSqlstate ) + { + char2wchar ( diagrow -> State, pSqlstate, -1 ); } - + // native error code if ( pNativeErrorPtr ) - { ( *pNativeErrorPtr ) = diagrow->NativeErrorCode; } - + { + ( *pNativeErrorPtr ) = diagrow -> NativeErrorCode; + } + // msg __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The message is %s", diagrow->Msg ) ); - _SQLCopyWCharData ( diag, pMsgTxtPtr, pMsgTxtSize, pMsgTxtSizePtr, 16, diagrow->Msg, -1, false ); + _SQLCopyWCharData ( diag, pMsgTxtPtr, pMsgTxtSize, pMsgTxtSizePtr, 16, diagrow -> Msg, -1, false ); // debug //__ODBCLOG(_ODBCLogMsg(LogLevel_DEBUG,"SQLGetDiagRec msg: %s", pMsgTxtPtr ? ( StrPtr )pMsgTxtPtr : "(unknown)" )); - RETCODE ret = ( pMsgTxtSizePtr && ( *pMsgTxtSizePtr ) > pMsgTxtSize ) ? SQL_SUCCESS_WITH_INFO : SQL_SUCCESS; + RETCODE ret = ( pMsgTxtSizePtr && ( *pMsgTxtSizePtr ) > pMsgTxtSize ) ? SQL_SUCCESS_WITH_INFO : SQL_SUCCESS; __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The SQLGetDiagRecW return code is %d", ret ) ); return ret; } - // ----------------------------------------------------------------------- // to get all details of a diag row on specified handle // ----------------------------------------------------------------------- -RETCODE SQL_API SQLGetDiagRec ( SQLSMALLINT pHandleType, - SQLHANDLE pHandle, - SQLSMALLINT pRecNum, - SQLCHAR* pSqlstate, - SQLINTEGER* pNativeErrorPtr, - SQLCHAR* pMsgTxtPtr, - SQLSMALLINT pMsgTxtSize, - SQLSMALLINT* pMsgTxtSizePtr ) { +RETCODE SQL_API SQLGetDiagRec ( SQLSMALLINT pHandleType, + SQLHANDLE pHandle, + SQLSMALLINT pRecNum, + SQLCHAR* pSqlstate, + SQLINTEGER* pNativeErrorPtr, + SQLCHAR* pMsgTxtPtr, + SQLSMALLINT pMsgTxtSize, + SQLSMALLINT* pMsgTxtSizePtr ) +{ __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetDiagRec called, HandleType: %d, RecNum: %d, BufLen: %d", pHandleType, - pRecNum, pMsgTxtSize ) ); - pODBCDiag diag; + pRecNum, pMsgTxtSize ) ); + pODBCDiag diag; pODBCDiagRow diagrow; __CHK_HANDLE ( pHandle, pHandleType, SQL_ERROR ); diag = _SQLGetDiagHandle ( pHandleType, pHandle ); - - if ( !diag ) { return SQL_ERROR; } - + + if ( !diag ) + { + return SQL_ERROR; + } + // now get the desired diag row if ( ( diagrow = _SQLGetDiagRowX ( diag, pRecNum ) ) == NULL ) - { return SQL_NO_DATA; } - + { + return SQL_NO_DATA; + } + // sql-state if ( pSqlstate ) - { strcpy ( ( char* ) pSqlstate, diagrow->State ); } - + { + strcpy ( ( char* ) pSqlstate, diagrow -> State ); + } + // native error code if ( pNativeErrorPtr ) - { ( *pNativeErrorPtr ) = diagrow->NativeErrorCode; } - + { + ( *pNativeErrorPtr ) = diagrow -> NativeErrorCode; + } + // msg - _SQLCopyCharData ( diag, pMsgTxtPtr, pMsgTxtSize, pMsgTxtSizePtr, 16, diagrow->Msg, -1 ); + _SQLCopyCharData ( diag, pMsgTxtPtr, pMsgTxtSize, pMsgTxtSizePtr, 16, diagrow -> Msg, -1 ); // debug __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetDiagRec msg: %s", pMsgTxtPtr ? ( StrPtr ) pMsgTxtPtr : "(unknown)" ) ); return ( pMsgTxtSizePtr && ( *pMsgTxtSizePtr ) > pMsgTxtSize ) ? SQL_SUCCESS_WITH_INFO : SQL_SUCCESS; @@ -510,59 +642,71 @@ RETCODE SQL_API SQLGetDiagRec ( SQLSMALLINT pHandleType, // ----------------------------------------------------------------------- pODBCDiagRow _SQLPutDiagRow ( pODBCDiag pDiag, StrPtr pFunc, StrPtr pState, Long pNativeErrorCode, - StrPtr pMsgArgs, va_list pArgs ) { - Char s[4096]; // arbitary and maximum length of message - pODBCDiagRow l; - pODBCDiagRow r; - + StrPtr pMsgArgs, va_list pArgs ) +{ + Char s[4096]; // arbitary and maximum length of message + pODBCDiagRow l; + pODBCDiagRow r; + // first set the value of source function, assuming less than 64 if ( pFunc ) - { strcpy ( pDiag->Func, pFunc ); } - + { + strcpy ( pDiag -> Func, pFunc ); + } + // create message template strcpy ( s, "[Kylin][ODBC 1.0(w) Driver]" ); - + // check if there is some message if ( pMsgArgs ) - { vsprintf ( s + strlen ( s ), pMsgArgs, pArgs ); } - + { + vsprintf ( s + strlen ( s ), pMsgArgs, pArgs ); + } + else - { strcat ( s, "(unknown)" ); } - + { + strcat ( s, "(unknown)" ); + } + // allocate a new row r = new ODBCDiagRow; // reset - memset ( r, 0, sizeof ( ODBCDiagRow ) ); - + memset ( r, 0, sizeof ( ODBCDiagRow) ); + // set the values for state and native error code - if ( pState ) { strncpy ( r->State, pState, SQL_SQLSTATE_SIZE ); } - - r->NativeErrorCode = pNativeErrorCode; + if ( pState ) + { + strncpy ( r -> State, pState, SQL_SQLSTATE_SIZE ); + } + + r -> NativeErrorCode = pNativeErrorCode; // allocate space for message - r->Msg = new Char[strlen ( s ) + 1]; - strcpy ( r->Msg, s ); + r -> Msg = new Char[strlen ( s ) + 1]; + strcpy ( r -> Msg, s ); // set the default row and col values - r->Row = SQL_ROW_NUMBER_UNKNOWN; - r->Col = SQL_COLUMN_NUMBER_UNKNOWN; + r -> Row = SQL_ROW_NUMBER_UNKNOWN; + r -> Col = SQL_COLUMN_NUMBER_UNKNOWN; __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "DiagMsg: %s", s ) ); - + // ATTACH TO LIST - + // check for any existing rows - if ( pDiag->DiagRows ) { + if ( pDiag -> DiagRows ) + { // iterate to last row - for ( l = pDiag->DiagRows; l->Next != NULL; l = l->Next ); - + for ( l = pDiag -> DiagRows; l -> Next != NULL; l = l -> Next ); + // attach - l->Next = r; // next of last row - r->Prev = l; // last row becomes the prev row of this row + l -> Next = r; // next of last row + r -> Prev = l; // last row becomes the prev row of this row } - - else { + + else + { // make it the first row - pDiag->DiagRows = r; + pDiag -> DiagRows = r; } - + return r; } @@ -571,19 +715,22 @@ pODBCDiagRow _SQLPutDiagRow ( pODBCDiag pDiag, StrPtr pFunc, StrPtr pState, Long // ----------------------------------------------------------------------- eGoodBad _SQLPutDiagRow ( SQLSMALLINT pHandleType, SQLHANDLE pHandle, StrPtr pFunc, StrPtr pState, - Long pNativeErrorCode, StrPtr pMsgArgs, ... ) { + Long pNativeErrorCode, StrPtr pMsgArgs, ... ) +{ // note // this implementation of function does not take row/col as param __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLPutDiagRow called, handle type is %d", pHandleType ) ); - va_list args; - pODBCDiag diag; - pODBCDiagRow r; + va_list args; + pODBCDiag diag; + pODBCDiagRow r; __CHK_HANDLE ( pHandle, pHandleType, BAD ); diag = _SQLGetDiagHandle ( pHandleType, pHandle ); - + if ( !diag ) - { return BAD; } - + { + return BAD; + } + // get va_args va_start ( args, pMsgArgs ); r = _SQLPutDiagRow ( diag, pFunc, pState, pNativeErrorCode, pMsgArgs, args ); @@ -596,30 +743,34 @@ eGoodBad _SQLPutDiagRow ( SQLSMALLINT pHandleType, SQLHANDLE pHandle, StrPtr pFu // ----------------------------------------------------------------------- eGoodBad _SQLPutDiagRow ( SQLSMALLINT pHandleType, SQLHANDLE pHandle, StrPtr pFunc, StrPtr pState, - Long pNativeErrorCode, Long pRow, Long pCol, StrPtr pMsgArgs, ... ) { + Long pNativeErrorCode, Long pRow, Long pCol, StrPtr pMsgArgs, ... ) +{ // note // this implementation of function takes take row/col as param __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLPutDiagRow called" ) ); - va_list args; - pODBCDiag diag; - pODBCDiagRow r; + va_list args; + pODBCDiag diag; + pODBCDiagRow r; __CHK_HANDLE ( pHandle, pHandleType, BAD ); diag = _SQLGetDiagHandle ( pHandleType, pHandle ); - + if ( !diag ) - { return BAD; } - + { + return BAD; + } + // get va_args va_start ( args, pMsgArgs ); r = _SQLPutDiagRow ( diag, pFunc, pState, pNativeErrorCode, pMsgArgs, args ); va_end ( args ); - - if ( r ) { - r->Row = pRow; - r->Col = pCol; + + if ( r ) + { + r -> Row = pRow; + r -> Col = pCol; return GOOD; } - + return BAD; } @@ -627,32 +778,37 @@ eGoodBad _SQLPutDiagRow ( SQLSMALLINT pHandleType, SQLHANDLE pHandle, StrPtr pFu // to free a specifed diag, plucks from parent/list AND FREEs it // ----------------------------------------------------------------------- -eGoodBad _SQLFreeDiag ( pODBCDiag pHandle ) { - pODBCDiagRow t; - +eGoodBad _SQLFreeDiag ( pODBCDiag pHandle ) +{ + pODBCDiagRow t; + // check if rows r there to be freed - while ( pHandle->DiagRows ) { + while ( pHandle -> DiagRows ) + { ////// PLUCK - t = pHandle->DiagRows; - pHandle->DiagRows = t->Next; - - if ( pHandle->DiagRows ) - { ( pHandle->DiagRows )->Prev = NULL; } - + t = pHandle -> DiagRows; + pHandle -> DiagRows = t -> Next; + + if ( pHandle -> DiagRows ) + { + ( pHandle -> DiagRows ) -> Prev = NULL; + } + ////// PLUCKED - + // free contents of row - if ( t->Msg ) { - delete[] t->Msg; - t->Msg = NULL; + if ( t -> Msg ) + { + delete[] t -> Msg; + t -> Msg = NULL; } - + // free the row itself delete t; // no rows - pHandle->DiagRows = NULL; + pHandle -> DiagRows = NULL; } - + // free any other contents of the diag structure return GOOD; } @@ -662,21 +818,23 @@ eGoodBad _SQLFreeDiag ( pODBCDiag pHandle ) { // to get the diag handle out of specified handle // ----------------------------------------------------------------------- -static pODBCDiag _SQLGetDiagHandle ( SQLSMALLINT pHandleType, SQLHANDLE pHandle ) { +static pODBCDiag _SQLGetDiagHandle ( SQLSMALLINT pHandleType, SQLHANDLE pHandle ) +{ // first extract the diag details - switch ( pHandleType ) { - case SQL_HANDLE_ENV: - return & ( ( ( pODBCEnv ) pHandle )->Diag ); - - case SQL_HANDLE_DBC: - return & ( ( ( pODBCConn ) pHandle )->Diag ); - - case SQL_HANDLE_STMT: - return & ( ( ( pODBCStmt ) pHandle )->Diag ); - - default: + switch ( pHandleType ) + { + case SQL_HANDLE_ENV : + return & ( ( ( pODBCEnv ) pHandle ) -> Diag ); + + case SQL_HANDLE_DBC : + return & ( ( ( pODBCConn ) pHandle ) -> Diag ); + + case SQL_HANDLE_STMT : + return & ( ( ( pODBCStmt ) pHandle ) -> Diag ); + + default : __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetDiagRec was called with desciptor handle" ) ); - return NULL; // ??? support for desc diag not available now + return NULL; // ??? support for desc diag not available now } } @@ -685,13 +843,14 @@ static pODBCDiag _SQLGetDiagHandle ( SQLSMALLINT pHandleType, SQLHANDLE pHandle // to get a specified diag row from link list // ----------------------------------------------------------------------- -static pODBCDiagRow _SQLGetDiagRowX ( pODBCDiag pHandle, Word pRowNum ) { - Word i; - pODBCDiagRow r; - +static pODBCDiagRow _SQLGetDiagRowX ( pODBCDiag pHandle, Word pRowNum ) +{ + Word i; + pODBCDiagRow r; + // loop to locate the specified row - for ( i = 1, r = pHandle->DiagRows; r != NULL && i <= pRowNum && i != pRowNum; r = r->Next, i ++ ); - + for ( i = 1 , r = pHandle -> DiagRows; r != NULL && i <= pRowNum && i != pRowNum; r = r -> Next , i ++ ); + // return the row or NULL as the case may be return ( r != NULL && i == pRowNum ) ? r : NULL; } @@ -700,114 +859,134 @@ static pODBCDiagRow _SQLGetDiagRowX ( pODBCDiag pHandle, Word pRowNum ) { // to show a message immmediately to a user // ----------------------------------------------------------------------- -void _ODBCPopMsg ( const char* pMsgArgs, ... ) { - Char s[4096]; // arbitary and maximum length of message - va_list args; - +void _ODBCPopMsg ( const char* pMsgArgs, ... ) +{ + Char s[4096]; // arbitary and maximum length of message + va_list args; + // check if there is some message - if ( pMsgArgs ) { + if ( pMsgArgs ) + { // convert to full msg including parsed params va_start ( args, pMsgArgs ); vsprintf ( s, pMsgArgs, args ); va_end ( args ); } - + else - { s[0] = 0; } - + { + s[0] = 0; + } + _ODBCLogMsg ( LogLevel_FATAL, s ); - #ifdef SHIPPING +#ifdef SHIPPING // no thing _ODBCLogMsg ( LogLevel_FATAL, "In Shipping mode, Skip popping up window..." ); - #else +#else // show as window MessageBox ( GetDesktopWindow(), s, "Kylin ODBC Says :", MB_OK ); - #endif +#endif } //pop directly -void __ODBCPopMsg ( const char* pMsgArgs, ... ) { - Char s[4096]; // arbitary and maximum length of message - va_list args; - +void __ODBCPopMsg ( const char* pMsgArgs, ... ) +{ + Char s[4096]; // arbitary and maximum length of message + va_list args; + // check if there is some message - if ( pMsgArgs ) { + if ( pMsgArgs ) + { // convert to full msg including parsed params va_start ( args, pMsgArgs ); vsprintf ( s, pMsgArgs, args ); va_end ( args ); } - + else - { s[0] = 0; } - - #ifdef _CONSOLE + { + s[0] = 0; + } + +#ifdef _CONSOLE // show on console fprintf ( stderr, s ) - #else +#else // show as window - MessageBox ( GetDesktopWindow(), s, "Kylin ODBC Says:", MB_OK ); - #endif + MessageBox ( GetDesktopWindow (), s, "Kylin ODBC Says:", MB_OK ); +#endif } // ----------------------------------------------------------------------- // to start log for debugging // ----------------------------------------------------------------------- -bool fileExist ( char* path ) { +bool fileExist ( char* path ) +{ DWORD dwAttrib = GetFileAttributes ( path ); return ( dwAttrib != INVALID_FILE_ATTRIBUTES && - ! ( dwAttrib & FILE_ATTRIBUTE_DIRECTORY ) ); + ! ( dwAttrib & FILE_ATTRIBUTE_DIRECTORY ) ); } -void _ODBCLogStart ( void ) { +void _ODBCLogStart ( void ) +{ OutputDebugString ( "ODBCLogStart is called\n" ); // for DBMON - StrPtr t; - time_t ltime; - + StrPtr t; + time_t ltime; + // check if log file is open - if ( gLogFile == -1 ) { + if ( gLogFile == -1 ) + { OutputDebugString ( "Try to init the log file\n" ); // for DBMON - - if ( GetFileAttributes ( "c:\\kylin" ) == INVALID_FILE_ATTRIBUTES ) { - if ( !CreateDirectory ( "c:\\kylin", NULL ) ) { - if ( GetLastError() == ERROR_ALREADY_EXISTS ) { + + if ( GetFileAttributes ( "c:\\kylin" ) == INVALID_FILE_ATTRIBUTES ) + { + if ( !CreateDirectory ( "c:\\kylin", NULL ) ) + { + if ( GetLastError () == ERROR_ALREADY_EXISTS ) + { // directory already exists //good OutputDebugString ( "Log folder already exist, ? \n" ); // for DBMON } - - else { + + else + { // creation failed due to some other reason OutputDebugString ( "Failed to creat log folder\n" ); // for DBMON throw; } } } - - else { + + else + { OutputDebugString ( "Log folder already exist\n" ); // for DBMON } - + bool debugMode = fileExist ( "c:\\kylin\\debug" ) || fileExist ( "c:\\kylin\\debug.txt" ); - - if ( debugMode ) { + + if ( debugMode ) + { currentLogLevel = LogLevel_DEBUG; OutputDebugString ( "Debug mode is on" ); // for DBMON } - + OutputDebugString ( "Try to open log file\n" ); // for DBMON - time_t now = time ( 0 ); - struct tm tstruct; + time_t now = time ( 0 ); + struct tm tstruct; char buffer[100]; tstruct = *localtime ( &now ); strftime ( buffer, 100, "%Y-%m-%d.%X", &tstruct ); - - for ( unsigned int i = 0 ; i < strlen ( buffer ); i++ ) { + + for ( unsigned int i = 0; i < strlen ( buffer ); i++ ) + { if ( buffer[i] == '.' || buffer[i] == ':' ) - { buffer[i] = '-'; } + { + buffer[i] = '-'; + } } - + char file[256]; file[0] = '\0'; strcat ( file, "c:\\kylin\\odbc-" ); @@ -816,15 +995,17 @@ void _ODBCLogStart ( void ) { printf ( file ); gLogFile = _open ( file, _O_CREAT | _O_APPEND | _O_RDWR, _S_IWRITE ); OutputDebugString ( "Finish to open log file\n" ); // for DBMON - - if ( gLogFile == -1 ) { + + if ( gLogFile == -1 ) + { OutputDebugString ( "Open Log file failed.\n" ); // for DBMON } - - else { + + else + { OutputDebugString ( "Open Log file succeed, logs are written to log file now.\n" ); // for DBMON } - + // set the log start time time ( <ime ); t = ctime ( <ime ); @@ -834,12 +1015,15 @@ void _ODBCLogStart ( void ) { //if(t!=NULL) //delete[] t; } - + // check if file opened succesfully if ( gLogFile != -1 ) - { ++ gLogUsage; } // increment log usage - - else { + { + ++ gLogUsage; + } // increment log usage + + else + { __ODBCPOPMSG ( ( __ODBCPopMsg ( "Log failed" ) ) ); } } @@ -848,19 +1032,22 @@ void _ODBCLogStart ( void ) { // to stop log // ----------------------------------------------------------------------- -void _ODBCLogStop ( int pForce ) { - StrPtr t; - time_t ltime; - +void _ODBCLogStop ( int pForce ) +{ + StrPtr t; + time_t ltime; + // check if log file is being used - if ( gLogUsage > 0 ) { + if ( gLogUsage > 0 ) + { // decrement log usage -- gLogUsage; // commit _commit ( gLogFile ); - + // check if log needs to be closed - if ( gLogUsage == 0 || pForce == 1 ) { + if ( gLogUsage == 0 || pForce == 1 ) + { // set the log start time time ( <ime ); t = ctime ( <ime ); @@ -878,76 +1065,79 @@ void _ODBCLogStop ( int pForce ) { // -------------------------------------------------------------------- // log a specified message // -------------------------------------------------------------------- -void _ODBCLogMsg ( LogLevel level , const wchar_t* textW ) { - unique_ptr<char[]> p ( wchar2char ( textW ) ); - _ODBCLogMsg ( level, p.get() ); +void _ODBCLogMsg ( LogLevel level, const wchar_t* textW ) +{ + unique_ptr <char[]> p ( wchar2char ( textW ) ); + _ODBCLogMsg ( level, p . get () ); } -void _ODBCLogMsg ( LogLevel level, const char* pMsgArgs, ... ) { - if ( level < currentLogLevel ) { +void _ODBCLogMsg ( LogLevel level, const char* pMsgArgs, ... ) +{ + if ( level < currentLogLevel ) + { return;//skip } - - Char s[4096]; // arbitary and maximum length of message - va_list args; - + + Char s[4096]; // arbitary and maximum length of message + va_list args; + // check if there is a log file - if ( gLogFile != -1 ) { - switch ( level ) { - case LogLevel_DEBUG: + if ( gLogFile != -1 ) + { + switch ( level ) + { + case LogLevel_DEBUG : _write ( gLogFile, "[DEBUG]", 7 ); break; - - case LogLevel_INFO: + + case LogLevel_INFO : _write ( gLogFile, "[INFO ]", 7 ); break; - - case LogLevel_WARN: + + case LogLevel_WARN : _write ( gLogFile, "[WARN ]", 7 ); break; - - case LogLevel_ERROR: + + case LogLevel_ERROR : _write ( gLogFile, "[ERROR]", 7 ); break; - - case LogLevel_FATAL: + + case LogLevel_FATAL : _write ( gLogFile, "[FATAL]", 7 ); break; - - default: + + default : break; } - - time_t now = time ( 0 ); - struct tm tstruct; + + time_t now = time ( 0 ); + struct tm tstruct; char buffer[100]; tstruct = *localtime ( &now ); strftime ( buffer, 100, "%Y-%m-%d.%X", &tstruct ); _write ( gLogFile, "[", 1 ); _write ( gLogFile, buffer, strlen ( buffer ) ); _write ( gLogFile, "]", 1 ); - + // MSG PARSING - + // check if there is some message - if ( pMsgArgs ) { + if ( pMsgArgs ) + { // convert to full msg including parsed params va_start ( args, pMsgArgs ); vsprintf ( s, pMsgArgs, args ); va_end ( args ); } - + else - { s[0] = 0; } - + { + s[0] = 0; + } + // LOG _write ( gLogFile, s, strlen ( s ) ); _write ( gLogFile, "\n", 1 ); } } - - - - -
http://git-wip-us.apache.org/repos/asf/kylin/blob/3c2329dc/odbc/Driver/KO_DTYPE.CPP ---------------------------------------------------------------------- diff --git a/odbc/Driver/KO_DTYPE.CPP b/odbc/Driver/KO_DTYPE.CPP index 62d6ee9..851fe70 100644 --- a/odbc/Driver/KO_DTYPE.CPP +++ b/odbc/Driver/KO_DTYPE.CPP @@ -15,7 +15,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - + // ---------------------------------------------------------------------------- // @@ -47,47 +47,49 @@ // ---------------------- function prototypes -------------------------- -eGoodBad _SQLCheckDataType ( Word pDataType ); -eGoodBad _SQLCheckIntervalCode ( Word pIntervalCode ); -eGoodBad _SQLSetDataType ( pODBCDiag pDiag, Word pFldID, Word pFldValue, Word* pVerboseDataType, - Word* pConciseDataType, Word* pDateTimeIntervalCode ); -eGoodBad GetIRDDataTypeDefaults ( CStrPtr pDataType, Word* pSqlDataType, Word* pNativeDataType, - Word* pPrecision, Word* pScale, Long* pLength, Long* pRadix ); +eGoodBad _SQLCheckDataType ( Word pDataType ); +eGoodBad _SQLCheckIntervalCode ( Word pIntervalCode ); +eGoodBad _SQLSetDataType ( pODBCDiag pDiag, Word pFldID, Word pFldValue, Word* pVerboseDataType, + Word* pConciseDataType, Word* pDateTimeIntervalCode ); +eGoodBad GetIRDDataTypeDefaults ( CStrPtr pDataType, Word* pSqlDataType, Word* pNativeDataType, + Word* pPrecision, Word* pScale, Long* pLength, Long* pRadix ); // ----------------------------------------------------------------------- // to check if the specified type is a valid SQL data type // ----------------------------------------------------------------------- -eGoodBad _SQLCheckDataType ( Word pDataType ) { - switch ( pDataType ) { - case SQL_CHAR: - case SQL_VARCHAR: - case SQL_WCHAR: - case SQL_WVARCHAR: - case SQL_C_SSHORT: - case SQL_C_USHORT: - case SQL_SMALLINT: - case SQL_C_SLONG: - case SQL_C_ULONG: - case SQL_INTEGER: - case SQL_NUMERIC: - case SQL_DECIMAL: - case SQL_FLOAT: - case SQL_REAL: - case SQL_DOUBLE: - case SQL_TYPE_DATE: - case SQL_TYPE_TIME: - case SQL_TYPE_TIMESTAMP: - case SQL_BIT: - case SQL_DEFAULT: - case SQL_C_SBIGINT : +eGoodBad _SQLCheckDataType ( Word pDataType ) +{ + switch ( pDataType ) + { + case SQL_CHAR : + case SQL_VARCHAR : + case SQL_WCHAR : + case SQL_WVARCHAR : + case SQL_C_SSHORT : + case SQL_C_USHORT : + case SQL_SMALLINT : + case SQL_C_SLONG : + case SQL_C_ULONG : + case SQL_INTEGER : + case SQL_NUMERIC : + case SQL_DECIMAL : + case SQL_FLOAT : + case SQL_REAL : + case SQL_DOUBLE : + case SQL_TYPE_DATE : + case SQL_TYPE_TIME : + case SQL_TYPE_TIMESTAMP : + case SQL_BIT : + case SQL_DEFAULT : + case SQL_C_SBIGINT : case SQL_C_UBIGINT : - case SQL_C_TINYINT : + case SQL_C_TINYINT : case SQL_C_STINYINT : case SQL_C_UTINYINT : return GOOD; - - default: + + default : __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLCheckDataType: Unknown data type: %d", pDataType ) ); return BAD; } @@ -98,7 +100,8 @@ eGoodBad _SQLCheckDataType ( Word pDataType ) { // to check if the specified type is a valid interval code // ----------------------------------------------------------------------- -eGoodBad _SQLCheckIntervalCode ( Word pIntervalCode ) { +eGoodBad _SQLCheckIntervalCode ( Word pIntervalCode ) +{ // can check the interval code return GOOD; } @@ -109,7 +112,8 @@ eGoodBad _SQLCheckIntervalCode ( Word pIntervalCode ) { // ----------------------------------------------------------------------- eGoodBad _SQLSetDataType ( pODBCDiag pDiag, Word pFldID, Word pFldValue, Word* pVerboseDataType, - Word* pConciseDataType, Word* pDateTimeIntervalCode ) { + Word* pConciseDataType, Word* pDateTimeIntervalCode ) +{ __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLSetDataType is called, pFldID:%d, pFldValue:%d", pFldID, pFldValue ) ); // note // the data type, concise data type, datetime interval code r interdependent @@ -118,253 +122,276 @@ eGoodBad _SQLSetDataType ( pODBCDiag pDiag, Word pFldID, Word pFldValue, Word* p Word verbose_type; Word datetime_interval; // initial values - concise_type = pConciseDataType ? *pConciseDataType : 0; - verbose_type = pVerboseDataType ? *pVerboseDataType : 0; - datetime_interval = pDateTimeIntervalCode ? *pDateTimeIntervalCode : 0; - + concise_type = pConciseDataType ? *pConciseDataType : 0; + verbose_type = pVerboseDataType ? *pVerboseDataType : 0; + datetime_interval = pDateTimeIntervalCode ? *pDateTimeIntervalCode : 0; + // check if concise type has been specified - if ( pFldID == SQL_DESC_CONCISE_TYPE ) { + if ( pFldID == SQL_DESC_CONCISE_TYPE ) + { // set the concise type itself first concise_type = pFldValue; - + // based on concise type set the verbose type and datetime interval - switch ( concise_type ) { - case SQL_TYPE_DATE: + switch ( concise_type ) + { + case SQL_TYPE_DATE : //case SQL_C_TYPE_DATE: - verbose_type = SQL_DATETIME; - datetime_interval = SQL_CODE_DATE; + verbose_type = SQL_DATETIME; + datetime_interval = SQL_CODE_DATE; break; - - case SQL_TYPE_TIME: + + case SQL_TYPE_TIME : //case SQL_C_TYPE_TIME: - verbose_type = SQL_DATETIME; - datetime_interval = SQL_CODE_TIME; + verbose_type = SQL_DATETIME; + datetime_interval = SQL_CODE_TIME; break; - - case SQL_TYPE_TIMESTAMP: + + case SQL_TYPE_TIMESTAMP : //case SQL_C_TYPE_TIMESTAMP: - verbose_type = SQL_DATETIME; - datetime_interval = SQL_CODE_TIMESTAMP; + verbose_type = SQL_DATETIME; + datetime_interval = SQL_CODE_TIMESTAMP; break; - - case SQL_INTERVAL_MONTH: + + case SQL_INTERVAL_MONTH : //case SQL_C_INTERVAL_MONTH: - verbose_type = SQL_INTERVAL; - datetime_interval = SQL_CODE_MONTH; + verbose_type = SQL_INTERVAL; + datetime_interval = SQL_CODE_MONTH; break; - - case SQL_INTERVAL_YEAR: + + case SQL_INTERVAL_YEAR : //case SQL_C_INTERVAL_YEAR: - verbose_type = SQL_INTERVAL; - datetime_interval = SQL_CODE_YEAR; + verbose_type = SQL_INTERVAL; + datetime_interval = SQL_CODE_YEAR; break; - - case SQL_INTERVAL_YEAR_TO_MONTH: + + case SQL_INTERVAL_YEAR_TO_MONTH : //case SQL_C_INTERVAL_YEAR_TO_MONTH: - verbose_type = SQL_INTERVAL; - datetime_interval = SQL_CODE_YEAR_TO_MONTH; + verbose_type = SQL_INTERVAL; + datetime_interval = SQL_CODE_YEAR_TO_MONTH; break; - - case SQL_INTERVAL_DAY: + + case SQL_INTERVAL_DAY : //case SQL_C_INTERVAL_DAY: - verbose_type = SQL_INTERVAL; - datetime_interval = SQL_CODE_DAY; + verbose_type = SQL_INTERVAL; + datetime_interval = SQL_CODE_DAY; break; - - case SQL_INTERVAL_HOUR: + + case SQL_INTERVAL_HOUR : //case SQL_C_INTERVAL_HOUR: - verbose_type = SQL_INTERVAL; - datetime_interval = SQL_CODE_HOUR; + verbose_type = SQL_INTERVAL; + datetime_interval = SQL_CODE_HOUR; break; - - case SQL_INTERVAL_MINUTE: + + case SQL_INTERVAL_MINUTE : //case SQL_C_INTERVAL_MINUTE: - verbose_type = SQL_INTERVAL; - datetime_interval = SQL_CODE_MINUTE; + verbose_type = SQL_INTERVAL; + datetime_interval = SQL_CODE_MINUTE; break; - - case SQL_INTERVAL_SECOND: + + case SQL_INTERVAL_SECOND : //case SQL_C_INTERVAL_SECOND: - verbose_type = SQL_INTERVAL; - datetime_interval = SQL_CODE_SECOND; + verbose_type = SQL_INTERVAL; + datetime_interval = SQL_CODE_SECOND; break; - - case SQL_INTERVAL_DAY_TO_HOUR: + + case SQL_INTERVAL_DAY_TO_HOUR : //case SQL_C_INTERVAL_DAY_TOHOUR: - verbose_type = SQL_INTERVAL; - datetime_interval = SQL_CODE_DAY_TO_HOUR; + verbose_type = SQL_INTERVAL; + datetime_interval = SQL_CODE_DAY_TO_HOUR; break; - - case SQL_INTERVAL_DAY_TO_MINUTE: + + case SQL_INTERVAL_DAY_TO_MINUTE : //case SQL_C_INTERVAL_DAY_TO_MINUTE: - verbose_type = SQL_INTERVAL; - datetime_interval = SQL_CODE_DAY_TO_MINUTE; + verbose_type = SQL_INTERVAL; + datetime_interval = SQL_CODE_DAY_TO_MINUTE; break; - - case SQL_INTERVAL_DAY_TO_SECOND: + + case SQL_INTERVAL_DAY_TO_SECOND : //case SQL_C_INTERVAL_DAY_TO_SECOND: - verbose_type = SQL_INTERVAL; - datetime_interval = SQL_CODE_DAY_TO_SECOND; + verbose_type = SQL_INTERVAL; + datetime_interval = SQL_CODE_DAY_TO_SECOND; break; - - case SQL_INTERVAL_HOUR_TO_MINUTE: + + case SQL_INTERVAL_HOUR_TO_MINUTE : //case SQL_C_INTERVAL_HOUR_TO_MINUTE: - verbose_type = SQL_INTERVAL; - datetime_interval = SQL_CODE_HOUR_TO_MINUTE; + verbose_type = SQL_INTERVAL; + datetime_interval = SQL_CODE_HOUR_TO_MINUTE; break; - - case SQL_INTERVAL_HOUR_TO_SECOND: + + case SQL_INTERVAL_HOUR_TO_SECOND : //case SQL_C_INTERVAL_HOUR_TO_SECOND: - verbose_type = SQL_INTERVAL; - datetime_interval = SQL_CODE_HOUR_TO_SECOND; + verbose_type = SQL_INTERVAL; + datetime_interval = SQL_CODE_HOUR_TO_SECOND; break; - - case SQL_INTERVAL_MINUTE_TO_SECOND: + + case SQL_INTERVAL_MINUTE_TO_SECOND : //case SQL_C_INTERVAL_MINUTE_TO_SECOND: - verbose_type = SQL_INTERVAL; - datetime_interval = SQL_CODE_MINUTE_TO_SECOND; + verbose_type = SQL_INTERVAL; + datetime_interval = SQL_CODE_MINUTE_TO_SECOND; break; - - default: - + + default : + // check if data type if valid if ( _SQLCheckDataType ( concise_type ) != GOOD ) - { return BAD; } - + { + return BAD; + } + // concise type does not relate to datetime or interval // hence both concise and verbose type r equal - verbose_type = concise_type; - datetime_interval = 0; + verbose_type = concise_type; + datetime_interval = 0; } } - + // check if verbose data type is being set - else if ( pFldID == SQL_DESC_TYPE ) { + else if ( pFldID == SQL_DESC_TYPE ) + { // set the verbose type itself first verbose_type = pFldValue; - + // based on verbose type & datetime interval code determine concise type - switch ( verbose_type ) { - case SQL_INTERVAL: - switch ( datetime_interval ) { - case SQL_CODE_DATE: + switch ( verbose_type ) + { + case SQL_INTERVAL : + switch ( datetime_interval ) + { + case SQL_CODE_DATE : concise_type = SQL_TYPE_DATE; break; - - case SQL_CODE_TIME: + + case SQL_CODE_TIME : concise_type = SQL_TYPE_TIME; break; - - case SQL_CODE_TIMESTAMP: + + case SQL_CODE_TIMESTAMP : concise_type = SQL_TYPE_TIMESTAMP; break; - - default: + + default : // interval should have been set __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetDataType: Interval code not yet set for SQL_INTERVAL" ) ); return BAD; } - + break; - - case SQL_DATETIME: - switch ( datetime_interval ) { - case SQL_CODE_MONTH: + + case SQL_DATETIME : + switch ( datetime_interval ) + { + case SQL_CODE_MONTH : concise_type = SQL_INTERVAL_MONTH; break; - - case SQL_CODE_YEAR: + + case SQL_CODE_YEAR : concise_type = SQL_INTERVAL_YEAR; break; - - case SQL_CODE_YEAR_TO_MONTH: + + case SQL_CODE_YEAR_TO_MONTH : concise_type = SQL_INTERVAL_YEAR_TO_MONTH; break; - - case SQL_CODE_DAY: + + case SQL_CODE_DAY : concise_type = SQL_INTERVAL_DAY; break; - - case SQL_CODE_HOUR: + + case SQL_CODE_HOUR : concise_type = SQL_INTERVAL_HOUR; break; - - case SQL_CODE_MINUTE: + + case SQL_CODE_MINUTE : concise_type = SQL_INTERVAL_MINUTE; break; - - case SQL_CODE_SECOND: + + case SQL_CODE_SECOND : concise_type = SQL_INTERVAL_SECOND; break; - - case SQL_CODE_DAY_TO_HOUR: + + case SQL_CODE_DAY_TO_HOUR : concise_type = SQL_INTERVAL_DAY_TO_HOUR; break; - - case SQL_CODE_DAY_TO_MINUTE: + + case SQL_CODE_DAY_TO_MINUTE : concise_type = SQL_INTERVAL_DAY_TO_MINUTE; break; - - case SQL_CODE_DAY_TO_SECOND: + + case SQL_CODE_DAY_TO_SECOND : concise_type = SQL_INTERVAL_DAY_TO_SECOND; break; - - case SQL_CODE_HOUR_TO_MINUTE: + + case SQL_CODE_HOUR_TO_MINUTE : concise_type = SQL_INTERVAL_HOUR_TO_MINUTE; break; - - case SQL_CODE_HOUR_TO_SECOND: + + case SQL_CODE_HOUR_TO_SECOND : concise_type = SQL_INTERVAL_HOUR_TO_SECOND; break; - - case SQL_CODE_MINUTE_TO_SECOND: + + case SQL_CODE_MINUTE_TO_SECOND : concise_type = SQL_INTERVAL_MINUTE_TO_SECOND; break; - - default: + + default : // interval should have been set __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetDataType: Interval code not yet set for SQL_DATETIME" ) ); return BAD; } - + break; - - default: - + + default : + // check if data type if valid if ( _SQLCheckDataType ( verbose_type ) != GOOD ) - { return BAD; } - + { + return BAD; + } + // verbose type does not relate to datetime or interval // hence both concise and verbose type r equal - concise_type = verbose_type; - datetime_interval = 0; + concise_type = verbose_type; + datetime_interval = 0; break; } } - - else if ( pFldID == SQL_DESC_DATETIME_INTERVAL_CODE ) { + + else if ( pFldID == SQL_DESC_DATETIME_INTERVAL_CODE ) + { // check if date interval code is valid if ( _SQLCheckIntervalCode ( pFldValue ) != GOOD ) - { return BAD; } - + { + return BAD; + } + // set the datetime interval code, autonomously datetime_interval = pFldValue; } - + // unknown field to set - else { + else + { __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetDataType: Unknown field type" ) ); return BAD; } - + // pass back values to caller - if ( pVerboseDataType ) { *pVerboseDataType = verbose_type; } - - if ( pConciseDataType ) { *pConciseDataType = concise_type; } - - if ( pDateTimeIntervalCode ) { *pDateTimeIntervalCode = datetime_interval; } - + if ( pVerboseDataType ) + { + *pVerboseDataType = verbose_type; + } + + if ( pConciseDataType ) + { + *pConciseDataType = concise_type; + } + + if ( pDateTimeIntervalCode ) + { + *pDateTimeIntervalCode = datetime_interval; + } + return GOOD; } @@ -373,7 +400,8 @@ eGoodBad _SQLSetDataType ( pODBCDiag pDiag, Word pFldID, Word pFldValue, Word* p // ----------------------------------------------------------------------- eGoodBad GetIRDDataTypeDefaults ( CStrPtr pDataType, Word* pSqlDataType, Word* pNativeDataType, Word* pPrecision, - Word* pScale, Long* pLength, Long* pRadix ) { + Word* pScale, Long* pLength, Long* pRadix ) +{ return BAD; }