DWORD Sm_Shiloh::ReadDone( SNI_Packet ** ppPacket, __out SNI_Packet ** ppLeftOver, DWORD dwBytes, DWORD dwError ) { BidxScopeAutoSNI5( SNIAPI_TAG _T("%u#, ") _T("ppPacket: %p{SNI_Packet**}, ") _T("ppLeftOver: %p{SNI_Packet**}, ") _T("dwBytes: %d, ") _T("dwError: %d{WINERR}\n"), GetBidId(), ppPacket, ppLeftOver, dwBytes, dwError); *ppLeftOver = 0; // If an error has occurred, then let's return that error. // Otherwise, let's force an error. (Sm_Shiloh does not // treat any errors as "valid") // if( !dwError ) dwError = ERROR_FAIL; SNI_SET_LAST_ERROR( SM_PROV, SNIE_1, dwError ); BidTraceU1( SNI_BID_TRACE_ON, RETURN_TAG _T("%d{WINERR}\n"), dwError); return dwError; }
DWORD Sm::OpenNpBasedYukon( __in SNI_CONSUMER_INFO * pConsumerInfo, __out SNI_Conn ** ppConn, __in ProtElem * pProtElem, __out SNI_Provider ** ppProv, BOOL fSync ) { BidxScopeAutoSNI5( SNIAPI_TAG _T( "pConsumerInfo: %p{SNI_CONSUMER_INFO*}, ppConn: %p{SNI_Conn**}, pProtElem: %p{ProtElem*}, ppProv: %p{SNI_Provider**}, fSync: %d{BOOL}\n"), pConsumerInfo, ppConn, pProtElem, ppProv, fSync); DWORD dwError = ERROR_SUCCESS; SNI_Conn * pConn = NULL; // Locals used for Shared-Memory mapping into Named-Pipes // ProtElem protElemSmOverNp; DWORD dwLength = sizeof(protElemSmOverNp.Np.Pipe) / sizeof(protElemSmOverNp.Np.Pipe[0]); LPSTR szInstance = NULL; Assert( NULL == *ppConn ); dwError = Sm::CreateSNIConn( pConsumerInfo, &pConn, pProtElem, fSync ); if( ERROR_SUCCESS != dwError ) { goto ErrorExit; } // Parse out the instance // szInstance = StrChrA_SYS(pProtElem->Sm.Alias,(int) strlen(pProtElem->Sm.Alias), '\\'); if( szInstance ) (szInstance) += 1; else szInstance = "MSSQLSERVER"; protElemSmOverNp.SetProviderNum(NP_PROV); protElemSmOverNp.m_ProviderToReport = SM_PROV; dwError = protElemSmOverNp.Init( pProtElem->m_szServerName, pProtElem->m_szOriginalServerName ); if( ERROR_SUCCESS != dwError ) { goto ErrorExit; } protElemSmOverNp.Np.Pipe[dwLength - 1] = '\0'; if( FAILED ( StringCchPrintf_lA( protElemSmOverNp.Np.Pipe, dwLength, "%s%s", GetDefaultLocale(), "\\\\.\\pipe\\SQLLocal\\", szInstance ) ) ) { dwError = ERROR_BUFFER_OVERFLOW; goto ErrorExit; } if( ERROR_SUCCESS != (dwError = Np::Open(pConn, &protElemSmOverNp, ppProv)) ) goto ErrorExit; pConn->m_ConnInfo.TransportProvider = pProtElem->GetProviderNum(); *ppConn = pConn; pConn = NULL; BidTraceU3( SNI_BID_TRACE_ON, RETURN_TAG _T("*ppConn: %p{SNI_Conn*}, *ppProv: %p{SNI_Provider*}, %d{WINERR}\n"), *ppConn, *ppProv, dwError); return ERROR_SUCCESS; ErrorExit: if( NULL != pConn ) { pConn->Release( REF_Active ); pConn = NULL; } BidTraceU1( SNI_BID_TRACE_ON, RETURN_TAG _T("%d{WINERR}\n"), dwError); return dwError; }
DWORD Sm::OpenWithFallback( __in SNI_CONSUMER_INFO * pConsumerInfo, __out SNI_Conn ** ppConn, __in ProtElem * pProtElem, __out SNI_Provider ** ppProv, BOOL fSync ) { BidxScopeAutoSNI5( SNIAPI_TAG _T( "pConsumerInfo: %p{SNI_CONSUMER_INFO*}, ppConn: %p{SNI_Conn**}, pProtElem: %p{ProtElem*}, ppProv: %p{SNI_Provider**}, fSync: %d{BOOL}\n"), pConsumerInfo, ppConn, pProtElem, ppProv, fSync); DWORD dwError = ERROR_SUCCESS; BOOL fQAdded = FALSE; BOOL fNewer = FALSE; // Tmpry Sm *pSm = NULL; // For Shiloh connectivity BOOL fSNIenabled = FALSE; BOOL fSrvVersionRetrieved = FALSE; // Set the instance LPSTR szInstance = NULL; *ppConn = NULL; szInstance = StrChrA_SYS(pProtElem->Sm.Alias,(int) strlen(pProtElem->Sm.Alias), '\\'); if( szInstance ) (szInstance) += 1; else szInstance = "MSSQLSERVER"; #ifdef SNI_BASED_CLIENT //Load instapi and set global flag gdwfInstapidll (void) LoadInstapiIfNeeded(); // Do not connect over shared memory to a clustered server if( Sm::IsClustered(szInstance) ) { SNI_SET_LAST_ERROR( SM_PROV, SNIE_29, ERROR_NOT_SUPPORTED ); BidTraceU1( SNI_BID_TRACE_ON, RETURN_TAG _T("Cluster is not supported over shared memory. %d{WINERR}\n"), ERROR_NOT_SUPPORTED); dwError = ERROR_NOT_SUPPORTED; goto ErrorExit; } // Check if this server instance is SNI-based or not if( ERROR_SUCCESS != (dwError = Sm::IsYukonByInstanceString(szInstance, &fSNIenabled, &fNewer, &fSrvVersionRetrieved)) ) goto ErrorExit; // If the server is Yukon+ or we failed to retrieve the server's // version try Yukon's LPC first (the latter can happen, e.g. // when talking to a Yukon IDW14/15 server across 32/64-bit // boundary). Assert( fSrvVersionRetrieved || !fSNIenabled ); // Yukon server is not supported on Win9x. if( fSNIenabled && gfIsWin9x ) { SNI_SET_LAST_ERROR( SM_PROV, SNIE_14, ERROR_NOT_SUPPORTED ); dwError = ERROR_NOT_SUPPORTED; goto ErrorExit; } #else // #ifdef SNI_BASED_CLIENT fSNIenabled = TRUE; fNewer = TRUE; fSrvVersionRetrieved = TRUE; #endif // #else ... #ifdef SNI_BASED_CLIENT if( ( fSNIenabled || !fSrvVersionRetrieved ) && !gfIsWin9x ) { // Try Yukon's NP-based LPC. // Assert( NULL == *ppConn ); dwError = Sm::OpenNpBasedYukon( pConsumerInfo, ppConn, pProtElem, ppProv, fSync ); if( ERROR_SUCCESS == dwError ) { goto SuccessExit; } if( fSNIenabled || !fSync ) { goto ErrorExit; } // Otherwise, we failed to retrieve the server version, failed // to make a Yukon LPC connection, and the connection is [....], // so fall back and try Shiloh LPC connection. } #ifdef SNI_BASED_CLIENT // If we got here either we retrieved pre-Yukon version or we failed // to retrieve server version and failed to connect over Yukon LPC. // Try Shiloh LPC now. Assert( !fSNIenabled ); // If this is an Aysnc connection - return error. // Async is NOT supported for Shiloh servers. if( !fSync ) { SNI_SET_LAST_ERROR( SM_PROV, SNIE_3, ERROR_NOT_SUPPORTED ); BidTraceU1( SNI_BID_TRACE_ON, RETURN_TAG _T("SQL Server 2000 does not support Async Shared Memory Connection. %d{WINERR}\n"), ERROR_NOT_SUPPORTED); dwError = ERROR_NOT_SUPPORTED; goto ErrorExit; } SNI_Conn * pConn = NULL; dwError = Sm::CreateSNIConn( pConsumerInfo, &pConn, pProtElem, fSync ); if( ERROR_SUCCESS != dwError ) { Assert( NULL == pConn ); goto ErrorExit; } dwError = Sm_Shiloh::Open(pConn, pProtElem, ppProv); if( ERROR_SUCCESS != dwError ) { pConn->Release( REF_Active ); pConn = NULL; goto ErrorExit; } *ppConn = pConn; pConn = NULL; #endif // #ifdef SNI_BASED_CLIENT SuccessExit: BidTraceU3( SNI_BID_TRACE_ON, RETURN_TAG _T("*ppConn: %p{SNI_Conn*}, *ppProv: %p{SNI_Provider*}, %d{WINERR}\n"), *ppConn, *ppProv, dwError); return dwError; ErrorExit: BidTraceU1( SNI_BID_TRACE_ON, RETURN_TAG _T("%d{WINERR}\n"), dwError); return dwError; }