Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
}