⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datasource.cpp

📁 用测试OLE DB提供者的一个程序。能够测试出OEL DB提供者到底实现了哪些接口?很灵的。
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/////////////////////////////////////////////////////////////////
HRESULT CDataSource::AdviseListeners()
{
	HRESULT hr = E_FAIL;
	
	//IDBAsynchNotify Listener
	//This is optional functionality so don't post error
	if(m_pIUnknown && GetOptionsObj()->m_dwNotifyOpts & NOTIFY_IDBASYNCHNOTIFY)
		hr = m_pCAsynchNotify->Advise(m_pIUnknown);

	return hr;
}


/////////////////////////////////////////////////////////////////
// HRESULT CDataSource::UnadviseListeners
//
/////////////////////////////////////////////////////////////////
HRESULT CDataSource::UnadviseListeners()
{
	HRESULT hr = E_FAIL;
	
	//IDBAsynchNotify Listener
	//This is optional functionality so don't post error
	if(m_pIUnknown)
		hr = m_pCAsynchNotify->Unadvise(m_pIUnknown);

	return hr;
}


/////////////////////////////////////////////////////////////////
// HRESULT CDataSource::CreateDataSource
//
/////////////////////////////////////////////////////////////////
HRESULT CDataSource::CreateDataSource(IUnknown* pIUnknown, ULONG cPropSets, DBPROPSET* rgPropSets)
{
	ASSERT(pIUnknown);
	HRESULT			hr = E_FAIL;

	//Connect to the provider
	TESTC(hr = Connect(pIUnknown));

	//SetProperties
	TESTC(hr = SetProperties(cPropSets, rgPropSets));

	//Initialize
	TESTC(hr = Initialize());

CLEANUP:
	return hr;
}



/////////////////////////////////////////////////////////////////
// HRESULT CDataSource::Connect
//
/////////////////////////////////////////////////////////////////
HRESULT CDataSource::Connect(IUnknown* pIUnknown)
{
	//No-op
	if(pIUnknown == NULL)
		return E_FAIL;
	
	HWND	hWnd = m_pCMDIChild->m_hWnd;		
	CListBox* pCListBox = m_pCMDIChild->m_pCListBox;

	ASSERT(m_pIDBInitialize == NULL);
	ASSERT(m_pIDBProperties	== NULL);

	pCListBox->OutputAddRef(pIUnknown);
	m_pIUnknown = pIUnknown;

	//The Object (Enum or DataSource) may require initialization
	pCListBox->OutputQI(m_pIUnknown, IID_IDBInitialize, (IUnknown**)&m_pIDBInitialize);
	pCListBox->OutputQI(m_pIUnknown, IID_IDBProperties, (IUnknown**)&m_pIDBProperties);
	return S_OK;
}


/////////////////////////////////////////////////////////////////
// HRESULT CDataSource::Initialize
//
/////////////////////////////////////////////////////////////////
HRESULT CDataSource::Initialize()
{
	HRESULT	hr = S_OK;
	HWND	hWnd = m_pCMDIChild->m_hWnd;		
	CListBox* pCListBox = m_pCMDIChild->m_pCListBox;

	if(m_pIDBInitialize)
	{
		//We actually want to advise our listeners, before Initialization
		//So we can get any notifications that occurr....
		AdviseListeners();

		//Initailize
		pCListBox->OutputPreMethod("IDBInitialize::Initialize()");
		XTEST_(hWnd, hr = m_pIDBInitialize->Initialize(),S_OK);
		pCListBox->OutputPostMethod(hr, "IDBInitialize::Initialize()");
		if(hr == DB_S_ERRORSOCCURRED || hr == DB_E_ERRORSOCCURRED)
		{
			DisplayPropErrors(hWnd, DATASOURCE, m_pIDBInitialize);

			//We don't want to continue if there were property errors
			//during intialization, treat as if a failure...
			hr = DB_E_ERRORSOCCURRED;
			goto CLEANUP;
		}
		TESTC(hr);
	}

	//Delegate to other Create which assumes already Initialized
	TESTC(hr = CreateDataSource(this));

	//We are now Connected and Initialized
	m_fConnected = TRUE;
	
CLEANUP:
	return hr;
}


/////////////////////////////////////////////////////////////////
// HRESULT CDataSource::SetProperties
//
/////////////////////////////////////////////////////////////////
HRESULT CDataSource::SetProperties(ULONG cPropSets, DBPROPSET* rgPropSets)
{
	HRESULT	hr = S_OK;
	HWND	hWnd = m_pCMDIChild->m_hWnd;		
	CListBox* pCListBox = m_pCMDIChild->m_pCListBox;

	if(m_pIDBProperties && cPropSets)
	{
		//SetProperties
		pCListBox->OutputPreMethod("IDBProperties::SetProperties(%d, 0x%08x)", cPropSets, rgPropSets);
		XTEST_(hWnd, hr = m_pIDBProperties->SetProperties(cPropSets, rgPropSets),S_OK);
		pCListBox->OutputPostMethod(hr, "IDBProperties::SetProperties(%d, 0x%08x)", cPropSets, rgPropSets);
		if(hr == DB_S_ERRORSOCCURRED || hr == DB_E_ERRORSOCCURRED)
		{
			DisplayPropErrors(hWnd, cPropSets, rgPropSets);

			//We don't want to continue if there were property errors
			//during intialization, treat as if a failure...
			hr = DB_E_ERRORSOCCURRED;
			goto CLEANUP;
		}
		TESTC(hr);
	}

CLEANUP:
	return hr;
}


/////////////////////////////////////////////////////////////////
// HRESULT CDataSource::SetEnumInfo
//
/////////////////////////////////////////////////////////////////
HRESULT CDataSource::SetEnumInfo(ENUMINFO* pEnumInfo)
{
	HRESULT hr = S_OK;
	WCHAR* pwszProgID = NULL;
	CLSID clsid;
	
	if(pEnumInfo)
	{
		//This is additional info is from the Root Enumerator
		//Contains info such as Name, ParseName, Description
		//Of the provider, mainly only used for UI purposes, but nice to have incase...
		memcpy(&m_EnumInfo, pEnumInfo, sizeof(ENUMINFO));
	}
	else
	{
		memset(&m_EnumInfo, 0, sizeof(ENUMINFO));
		TESTC(hr = GetClassID(clsid, &pwszProgID));
		if(pwszProgID)
		{
			wcscpy(m_EnumInfo.wszName, pwszProgID);
			wcscpy(m_EnumInfo.wszParseName, pwszProgID);
		}
		
	}
		
CLEANUP:
	SAFE_FREE(pwszProgID);
	return S_OK;
}

////////////////////////////////////////////////////////////////
// CDataSource::GetEnumInfo
//
/////////////////////////////////////////////////////////////////
ENUMINFO* CDataSource::GetEnumInfo()
{
	return &m_EnumInfo;
}


////////////////////////////////////////////////////////////////
// CDataSource::GetClassID
//
/////////////////////////////////////////////////////////////////
HRESULT CDataSource::GetClassID(REFCLSID clsid, WCHAR** ppwszProgID)
{
	ASSERT(m_pIPersist);
	HRESULT hr = S_OK;
	HWND	hWnd = m_pCMDIChild->m_hWnd;		
	CListBox* pCListBox = m_pCMDIChild->m_pCListBox;
	WCHAR* pwszProgID = NULL;

	//IPersist::GetClassID
	TESTC(pCListBox->OutputPreMethod("IPerist::GetClassID(%S)", pwszProgID));
	XTEST(hWnd, hr = m_pIPersist->GetClassID((CLSID*)&clsid));

	//Obtain ProgID
	pwszProgID = GetProgID(clsid);
	TESTC(pCListBox->OutputPostMethod(hr, "IPerist::GetClassID(%S)", pwszProgID));
	
CLEANUP:
	if(ppwszProgID)
		*ppwszProgID = pwszProgID;
	else
		SAFE_FREE(pwszProgID);
	return hr;
}



/////////////////////////////////////////////////////////////////
// CSession::CSession
//
/////////////////////////////////////////////////////////////////
CSession::CSession(CMDIChild* pCMDIChild, CDataSource* pCDataSource) : CBase(pCMDIChild)
{
	//BackPointer
	ASSERT(pCDataSource);
	m_pCDataSource =  pCDataSource;
	
	//OLEDB Interfaces
	m_pIGetDataSource		= NULL;		//Session interface
	m_pIOpenRowset			= NULL;		//Session interface
	m_pISessionProperties	= NULL;		//Session interface
	m_pIDBCreateCommand		= NULL;		//Session interface
	m_pIDBSchemaRowset		= NULL;		//Session interface
	m_pIIndexDefinition		= NULL;		//Session interface
	m_pISupportErrorInfo	= NULL;		//Session interface
	m_pITableDefinition		= NULL;		//Session interface
	m_pITransactionJoin		= NULL;		//Session interface
	m_pITransactionLocal	= NULL;		//Session interface
	m_pITransactionObject	= NULL;		//Session interface

	//Objects
	m_pCTransaction	= new CTransaction(pCMDIChild);
}

/////////////////////////////////////////////////////////////////
// CSession::~CSession
//
/////////////////////////////////////////////////////////////////
CSession::~CSession()
{
	//Objects
	SAFE_DELETE(m_pCTransaction);

	ReleaseSession();
}


/////////////////////////////////////////////////////////////////
// HRESULT CSession::SetInterface
//
/////////////////////////////////////////////////////////////////
HRESULT CSession::SetInterface(REFIID riid, IUnknown* pIUnknown)
{
	HRESULT hr = S_OK;

	//no-op
	if(pIUnknown == NULL)
		return E_INVALIDARG;

	//If the requested interface is a Session interface, place it in the
	//Appropiate member variable, otherwise we have to release it, since we
	//have no place to store it...
	if(riid == IID_IGetDataSource) 
		m_pIGetDataSource = (IGetDataSource*)pIUnknown;
	else if(riid == IID_IOpenRowset) 
		m_pIOpenRowset = (IOpenRowset*)pIUnknown;
	else if(riid == IID_ISessionProperties) 
		m_pISessionProperties = (ISessionProperties*)pIUnknown;
	else if(riid == IID_IDBCreateCommand) 
		m_pIDBCreateCommand = (IDBCreateCommand*)pIUnknown;
	else if(riid == IID_IDBSchemaRowset) 
		m_pIDBSchemaRowset = (IDBSchemaRowset*)pIUnknown;
	else if(riid == IID_IIndexDefinition) 
		m_pIIndexDefinition = (IIndexDefinition*)pIUnknown;
	else if(riid == IID_ISupportErrorInfo) 
		m_pISupportErrorInfo = (ISupportErrorInfo*)pIUnknown;
	else if(riid == IID_ITableDefinition) 
		m_pITableDefinition = (ITableDefinition*)pIUnknown;
	else if(riid == IID_ITransactionJoin) 
		m_pITransactionJoin = (ITransactionJoin*)pIUnknown;
	else if(riid == IID_ITransactionLocal) 
		m_pITransactionLocal = (ITransactionLocal*)pIUnknown;
	else if(riid == IID_ITransactionObject) 
		m_pITransactionObject = (ITransactionObject*)pIUnknown;
	else
		hr = E_NOINTERFACE;

	return hr;
}


/////////////////////////////////////////////////////////////////
// HRESULT CSession::ReleaseSession
//
/////////////////////////////////////////////////////////////////
HRESULT CSession::ReleaseSession()
{
	//Session
	CListBox* pCListBox = m_pCMDIChild->m_pCListBox;

	pCListBox->OutputRelease((IUnknown**)&m_pIGetDataSource,		"IGetDataSource");
	pCListBox->OutputRelease((IUnknown**)&m_pIOpenRowset,			"IOpenRowset");
	pCListBox->OutputRelease((IUnknown**)&m_pISessionProperties,	"ISessionProperties");
	pCListBox->OutputRelease((IUnknown**)&m_pIDBCreateCommand,		"IDBCreateCommand");
	pCListBox->OutputRelease((IUnknown**)&m_pIDBSchemaRowset,		"IDBSchemaRowset");
	pCListBox->OutputRelease((IUnknown**)&m_pIIndexDefinition,		"IIndexDefinition");
	pCListBox->OutputRelease((IUnknown**)&m_pISupportErrorInfo,		"ISupportErrorInfo");
	pCListBox->OutputRelease((IUnknown**)&m_pITableDefinition,		"ITableDefinition");
	pCListBox->OutputRelease((IUnknown**)&m_pITransactionJoin,		"ITransactionJoin");
	pCListBox->OutputRelease((IUnknown**)&m_pITransactionLocal,		"ITransactionLocal");
	pCListBox->OutputRelease((IUnknown**)&m_pITransactionObject,	"ITransactionObject");
	ReleaseBase("Session");
	return S_OK;
}


/////////////////////////////////////////////////////////////////
// HRESULT CSession::CreateSession
//
/////////////////////////////////////////////////////////////////
HRESULT CSession::CreateSession(CSession* pCSession)
{
	//Use existing Session
	ASSERT(pCSession);
	HRESULT				hr = S_OK;
	HRESULT				hrOptional = S_OK;

	CListBox* pCListBox = m_pCMDIChild->m_pCListBox;
	HWND hWnd = pCListBox->m_hWnd;		

	//Release all Previous interfaces...
	IUnknown* pIUnknown = pCSession->m_pIUnknown;
	pCListBox->OutputAddRef(pIUnknown);
	ReleaseSession();
	m_pIUnknown = pIUnknown;
	
	//[OPTIONAL]
	if(m_pCMDIChild->GetConnectObj()->m_dwConnectOpts & CONNECT_CREATECOMMAND || m_pCMDIChild->GetOptionsObj()->m_dwRowsetOpts & ROWSET_AUTOQI)
		hrOptional = pCListBox->OutputQI(m_pIUnknown, IID_IDBCreateCommand,		(IUnknown**)&m_pIDBCreateCommand);

	//AutoQI
	if(GetOptionsObj()->m_dwRowsetOpts & ROWSET_AUTOQI)
	{  	
		//[MANDATORY] - We might be able to continue without these mandatory interface...
		hrOptional = pCListBox->OutputQI(m_pIUnknown, IID_IOpenRowset,			(IUnknown**)&m_pIOpenRowset);
		hrOptional = pCListBox->OutputQI(m_pIUnknown, IID_IGetDataSource,		(IUnknown**)&m_pIGetDataSource);
		hrOptional = pCListBox->OutputQI(m_pIUnknown, IID_ISessionProperties,	(IUnknown**)&m_pISessionProperties);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -