📄 datasource.cpp
字号:
/////////////////////////////////////////////////////////////////
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 + -