📄 atldb.h
字号:
pT->m_dwStatus |= DSF_INITIALIZED;
}
else
{
delete m_pCUtlPropInfo;
m_pCUtlPropInfo = NULL;
}
return hr;
}
};
// Implementation Class
class CPropColID :
public PROPCOLID,
public CDBIDOps
{
public:
CPropColID()
{
VariantInit(&vValue);
}
~CPropColID()
{
FreeDBIDs(&dbidProperty);
VariantClear(&vValue);
}
bool operator==(const CPropColID& colId)
{
return (CompareDBIDs(&dbidProperty, &(colId.dbidProperty)) == S_OK) ? true : false;
}
};
class CColumnIds :
public CDBIDOps,
public CSimpleArray<CPropColID>
{
public:
PPROPCOLID AddNode()
{
CPropColID colID;
if (Add(colID))
return &(m_aT[GetSize()]);
return NULL;
}
HRESULT RemoveColumnId(const DBID* pdbidProp)
{
for (int i = 0; i < GetSize(); i++)
{
if (CompareDBIDs(pdbidProp, &(m_aT[i].dbidProperty)) == S_OK)
return (RemoveAt(i)) ? S_OK : E_FAIL;
}
return E_FAIL;
}
HRESULT AddColumnId(DBPROP* pProp)
{
CPropColID colID;
HRESULT hr = CopyDBIDs(&(colID.dbidProperty),&(pProp->colid));
if(FAILED(hr))
return hr;
colID.dwOption = pProp->dwOptions;
hr = VariantCopy(&(colID.vValue),&(pProp->vValue));
if(FAILED(hr))
return hr;
return (Add(colID)) ? S_OK : E_OUTOFMEMORY;
}
HRESULT AddColumnId(PPROPCOLID pPropNode)
{
CPropColID colID;
HRESULT hr = CopyDBIDs(&(colID.dbidProperty),&(pPropNode->dbidProperty));
if(FAILED(hr))
return hr;
colID.dwOption = pPropNode->dwOption;
hr = VariantCopy(&(colID.vValue),&(pPropNode->vValue));
if(FAILED(hr))
return hr;
return (Add(colID)) ? S_OK : E_OUTOFMEMORY;
}
ULONG GetCountOfPropColids(){ return (ULONG)GetSize();}
PPROPCOLID FindColumnId(const DBID* pdbidProp)
{
for (int i = 0; i < GetSize(); i++)
{
if (CompareDBIDs(pdbidProp, &(m_aT[i].dbidProperty)) == S_OK)
return &(m_aT[i]);
}
return NULL;
}
HRESULT GetValue(int iColId, DWORD* pdwOptions, DBID* pColid, VARIANT* pvValue)
{
HRESULT hr;
ATLASSERT(pdwOptions && pColid && pvValue);
ATLASSERT(iColId >= 0 && iColId < m_nSize);
CPropColID& colId = m_aT[iColId];
*pdwOptions = colId.dwOption;
CopyDBIDs( pColid, &(colId.dbidProperty) );
if(FAILED(hr = VariantCopy(pvValue, &(colId.vValue))))
return hr;
return S_OK;
}
};
const ULONG cchDescBuffSize = 256;
const DWORD DBINTERNFLAGS_CHANGED = 0x00000001;
// Rules for GetPropertiesArgChk
const DWORD ARGCHK_PROPERTIESINERROR = 0x00000001;
// Implementation Class
template <class T>
class CUtlPropInfo : public CBitFieldOps, public CDBIDOps
{
public:
enum EnumGetPropInfo
{
GETPROPINFO_ALLPROPIDS = 0x0001,
GETPROPINFO_NOTSUPPORTED = 0x0002,
GETPROPINFO_ERRORSOCCURRED = 0x0004,
GETPROPINFO_VALIDPROP = 0x0008
};
CUtlPropInfo()
{
m_cUPropSet = 0;
m_pUPropSet = NULL;
m_cPropSetDex = 0;
m_rgiPropSetDex = NULL;
m_cElemPerSupported = 0;
m_rgdwSupported = NULL;
}
~CUtlPropInfo()
{
delete[] m_rgiPropSetDex;
delete[] m_rgdwSupported;
if (m_pUPropSet != NULL)
CoTaskMemFree(m_pUPropSet);
}
//Determine the number of description buffers needed
ULONG CalcDescripBuffers(ULONG cPropInfoSet, DBPROPINFOSET* pPropInfoSet)
{
ULONG cBuffers = 0;
ATLASSERT(m_pUPropSet);
ATLASSERT(cPropInfoSet && pPropInfoSet);
for(ULONG ulSet=0; ulSet<cPropInfoSet; ulSet++)
{
if( GetPropertySetIndex(&(pPropInfoSet[ulSet].guidPropertySet)) == S_OK)
{
for(ULONG ul=0; ul<m_cPropSetDex; ul++)
{
cBuffers += m_pUPropSet[m_rgiPropSetDex[ul]].cUPropInfo;
}
}
}
return cBuffers;
}
//Retrieve the property set indexes that match this property set.
HRESULT GetPropertySetIndex(const GUID* pPropertySet)
{
DWORD dwFlag = 0;
ULONG ulSet;
ATLASSERT(m_cUPropSet && m_pUPropSet);
ATLASSERT(m_rgiPropSetDex);
ATLASSERT(pPropertySet);
m_cPropSetDex = 0;
if(InlineIsEqualGUID(*pPropertySet, DBPROPSET_DATASOURCEALL))
{
dwFlag = DBPROPFLAGS_DATASOURCE;
}
else if(InlineIsEqualGUID(*pPropertySet, DBPROPSET_DATASOURCEINFOALL))
{
dwFlag = DBPROPFLAGS_DATASOURCEINFO;
}
else if(InlineIsEqualGUID(*pPropertySet, DBPROPSET_ROWSETALL))
{
dwFlag = DBPROPFLAGS_ROWSET;
}
else if(InlineIsEqualGUID(*pPropertySet,DBPROPSET_DBINITALL))
{
dwFlag = DBPROPFLAGS_DBINIT;
}
else if(InlineIsEqualGUID(*pPropertySet,DBPROPSET_SESSIONALL))
{
dwFlag = DBPROPFLAGS_SESSION;
}
else // No scan required, just look for match.
{
for(ulSet=0; ulSet<m_cUPropSet; ulSet++)
{
if( *(m_pUPropSet[ulSet].pPropSet) == *pPropertySet )
{
m_rgiPropSetDex[m_cPropSetDex] = ulSet;
m_cPropSetDex++;
break;
}
}
goto EXIT;
}
// Scan through the property sets looking for matching attributes
for(ulSet=0; ulSet<m_cUPropSet; ulSet++)
{
if( m_pUPropSet[ulSet].pUPropInfo[0].dwFlags & dwFlag )
{
m_rgiPropSetDex[m_cPropSetDex] = ulSet;
m_cPropSetDex++;
}
}
EXIT:
return (m_cPropSetDex) ? S_OK : S_FALSE;
}
//Retrieve the property id pointer
HRESULT GetUPropInfoPtr(ULONG iPropSetDex, DBPROPID dwPropertyId, UPROPINFO** ppUPropInfo)
{
// Scan through the property sets looking for matching attributes
for(ULONG ulProps=0; ulProps<m_pUPropSet[iPropSetDex].cUPropInfo; ulProps++)
{
if( m_pUPropSet[iPropSetDex].pUPropInfo[ulProps].dwPropId == dwPropertyId )
{
*ppUPropInfo = &(m_pUPropSet[iPropSetDex].pUPropInfo[ulProps]);
// Test to see if the property is supported for this
// instantiation
return (TESTBIT(&(m_rgdwSupported[iPropSetDex * m_cElemPerSupported]), ulProps)) ? S_OK : S_FALSE;
}
}
return S_FALSE;
}
HRESULT FInit(GUID* pguidSet = (GUID*)&GUID_NULL)
{
HRESULT hr;
hr = InitAvailUPropSets(&m_cUPropSet, &m_pUPropSet, &m_cElemPerSupported, pguidSet);
if (FAILED(hr))
return hr;
ATLASSERT((m_cUPropSet != 0) && (m_cElemPerSupported != 0));
if(!m_cUPropSet || !m_cElemPerSupported)
return E_FAIL;
ATLTRY(m_rgdwSupported = new DWORD[m_cUPropSet * m_cElemPerSupported])
if(m_rgdwSupported == NULL)
return E_OUTOFMEMORY;
if(FAILED(hr = InitUPropSetsSupported()))
{
delete[] m_rgdwSupported;
m_rgdwSupported = NULL;
return hr;
}
if(m_cUPropSet)
{
ATLTRY(m_rgiPropSetDex = new ULONG[m_cUPropSet])
if(m_rgiPropSetDex == NULL)
{
delete [] m_rgdwSupported;
return E_OUTOFMEMORY;
}
}
return S_OK;
}
HRESULT GetPropertyInfo(ULONG cPropertySets,
const DBPROPIDSET rgPropertySets[], ULONG* pcPropertyInfoSets,
DBPROPINFOSET** prgPropertyInfoSets,
WCHAR** ppDescBuffer, bool bInitialized = true,
const GUID* pGuid = NULL)
{
HRESULT hr = S_OK;
ULONG ul, ulSet, ulNext, ulEnd;
ULONG ulOutIndex;
ULONG cSets;
ULONG cPropInfos;
ULONG ulIndex = 0;
DWORD dwStatus = 0;
DBPROPINFO* pPropInfo = NULL;
DBPROPINFO* pCurPropInfo = NULL;
WCHAR* pDescBuffer = NULL;
DBPROPINFOSET* pPropInfoSet = NULL;
UPROPINFO* pUPropInfo = NULL;
WCHAR wszBuff[256];
int cch;
// If the consumer does not restrict the property sets
// by specify an array of property sets and a cPropertySets
// greater than 0, then we need to make sure we
// have some to return
if(cPropertySets == 0)
{
// Determine the number of property sets supported
// In this case, it usually the enumerator or data source asking for
// DBPROPSET_DBINIT information.
if (pGuid != NULL)
cSets = 1;
else
cSets = m_cUPropSet;
}
else
{
cSets = 0;
// Determine number of property sets required
// This is only required when any of the "special" property set GUIDs were specified
for(ulSet=0; ulSet<cPropertySets; ulSet++)
{
if (GetPropertySetIndex(&(rgPropertySets[ulSet].guidPropertySet)) == S_OK)
cSets += m_cPropSetDex;
else
cSets++;
}
}
ATLASSERT(cSets);
// Allocate the DBPROPINFOSET structures
pPropInfoSet = (DBPROPINFOSET*)CoTaskMemAlloc(cSets * sizeof(DBPROPINFOSET));
if(pPropInfoSet == NULL)
{
ATLTRACE2(atlTraceDBProvider, 0, "Could not allocate DBPROPSET array for GetProperties\n");
hr = E_OUTOFMEMORY;
goto EXIT;
}
memset(pPropInfoSet, 0, cSets * sizeof(DBPROPINFOSET));
ulOutIndex = 0;
// VC 6.0 ulEnd = cPropertySets == 0 ? cSets : cPropertySets;
ulEnd = cSets; // VC 6.0 SP3
// Fill in the output array
for(ulSet=0; ulSet<ulEnd; ulSet++)
{
// Depending of if Property sets are specified store the
// return property set.
if (cPropertySets == 0)
{
if (pGuid != NULL)
{
GUID const& guidSet = *pGuid;
if( (InlineIsEqualGUID(guidSet, DBPROPSET_DATASOURCEALL) ||
InlineIsEqualGUID(guidSet, DBPROPSET_DATASOURCEINFOALL) ||
InlineIsEqualGUID(guidSet, DBPROPSET_DBINITALL) ||
InlineIsEqualGUID(guidSet, DBPROPSET_SESSIONALL) ||
InlineIsEqualGUID(guidSet, DBPROPSET_ROWSETALL)) &&
GetPropertySetIndex(&guidSet) == S_OK )
{
for(ul=0; ul<m_cPropSetDex; ul++,ulOutIndex++)
{
pPropInfoSet[ulOutIndex].guidPropertySet = *(m_pUPropSet[m_rgiPropSetDex[ul]].pPropSet);
pPropInfoSet[ulOutIndex].cPropertyInfos = 0;
ulIndex = m_rgiPropSetDex[ul];
}
}
else
{
for (ULONG l=0; l<m_cUPropSet; l++)
{
if (InlineIsEqualGUID(*m_pUPropSet[l].pPropSet, *pGuid))
ulIndex = l;
}
if (l == m_cUPropSet)
{
ATLTRACE2(atlTraceDBProvider, 0, "Property Info Set not supported");
ulIndex = 0;
}
pPropInfoSet[ulSet].guidPropertySet = *pGuid;
}
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -