myprovidersess.h

来自「Visual_C++.NET实用编程百例」· C头文件 代码 · 共 225 行

H
225
字号
// myProviderSess.h : CmyProviderSession 的声明

#pragma once

#include "resource.h"       // 主符号
#include "myProviderRS.h"

class CmyProviderSessionTRSchemaRowset;
class CmyProviderSessionColSchemaRowset;
class CmyProviderSessionPTSchemaRowset;


// CmyProviderSession
[
	coclass,
	noncreatable,
	uuid("EAF8E9C8-A8CE-4C1C-BCAA-A97019AC8024"),
	threading("apartment"),
	registration_script("none")
]
class ATL_NO_VTABLE CmyProviderSession : 
	public IGetDataSourceImpl<CmyProviderSession>,
	public IOpenRowsetImpl<CmyProviderSession>,
	public ISessionPropertiesImpl<CmyProviderSession>,
	public IObjectWithSiteSessionImpl<CmyProviderSession>,
	public IDBSchemaRowsetImpl<CmyProviderSession>,
	public IDBCreateCommandImpl<CmyProviderSession, CmyProviderCommand>
{
public:
	CmyProviderSession()
	{
	}

	DECLARE_PROTECT_FINAL_CONSTRUCT()

	HRESULT FinalConstruct()
	{
		return FInit();
	}
	
	void FinalRelease() 
	{
	}

	STDMETHOD(OpenRowset)(IUnknown *pUnk, DBID *pTID, DBID *pInID, REFIID riid,
					   ULONG cSets, DBPROPSET rgSets[], IUnknown **ppRowset)
	{
		CmyProviderRowset* pRowset;
		return CreateRowset(pUnk, pTID, pInID, riid, cSets, rgSets, ppRowset, pRowset);
	}

	void SetRestrictions(ULONG cRestrictions, GUID* rguidSchema, ULONG* rgRestrictions)
	{
		for (ULONG l=0; l<cRestrictions; l++)
		{
			// 我们支持对表名称(但仅限于表名称)的限制
			if (InlineIsEqualGUID(rguidSchema[l], DBSCHEMA_TABLES))
				rgRestrictions[l] = 0x04;
			else if (InlineIsEqualGUID(rguidSchema[l], DBSCHEMA_COLUMNS))
				rgRestrictions[l] = 0x04;
			else if (InlineIsEqualGUID(rguidSchema[l], DBSCHEMA_PROVIDER_TYPES))
				rgRestrictions[l] = 0x00;
		}
	}

BEGIN_PROPSET_MAP(CmyProviderSession)
	BEGIN_PROPERTY_SET(DBPROPSET_SESSION)
		PROPERTY_INFO_ENTRY(SESS_AUTOCOMMITISOLEVELS)
	END_PROPERTY_SET(DBPROPSET_SESSION)
END_PROPSET_MAP()


BEGIN_SCHEMA_MAP(CmyProviderSession)
	SCHEMA_ENTRY(DBSCHEMA_TABLES, CmyProviderSessionTRSchemaRowset)
	SCHEMA_ENTRY(DBSCHEMA_COLUMNS, CmyProviderSessionColSchemaRowset)
	SCHEMA_ENTRY(DBSCHEMA_PROVIDER_TYPES, CmyProviderSessionPTSchemaRowset)
END_SCHEMA_MAP()

};

class CmyProviderSessionTRSchemaRowset : 
	public CSchemaRowsetImpl< CmyProviderSessionTRSchemaRowset, CTABLESRow, CmyProviderSession>
{
public:
BEGIN_PROPSET_MAP(CmyProviderSessionTRSchemaRowset)
	BEGIN_PROPERTY_SET(DBPROPSET_ROWSET)
		PROPERTY_INFO_ENTRY(IAccessor)
		PROPERTY_INFO_ENTRY(IColumnsInfo)
		PROPERTY_INFO_ENTRY(IConvertType)
		PROPERTY_INFO_ENTRY(IRowset)
		PROPERTY_INFO_ENTRY(IRowsetIdentity)
		PROPERTY_INFO_ENTRY(IRowsetInfo)
		PROPERTY_INFO_ENTRY(CANFETCHBACKWARDS)
		PROPERTY_INFO_ENTRY(CANHOLDROWS)
		PROPERTY_INFO_ENTRY(CANSCROLLBACKWARDS)
		PROPERTY_INFO_ENTRY_VALUE(MAXOPENROWS, 0)
		PROPERTY_INFO_ENTRY_VALUE(MAXROWS, 0)
	END_PROPERTY_SET(DBPROPSET_ROWSET)
END_PROPSET_MAP()

	HRESULT Execute(LONG* pcRowsAffected, ULONG, const VARIANT*)
	{
		CmyProviderWindowsFile wf;
		CTABLESRow trData;
		lstrcpyW(trData.m_szType, OLESTR("TABLE"));
		lstrcpyW(trData.m_szDesc, OLESTR("目录表"));

		HANDLE hFile = INVALID_HANDLE_VALUE;
		TCHAR szDir[MAX_PATH + 1];
		TCHAR szWildcard[] = _T("\\*.*");
		DWORD cchWildcard = sizeof(szWildcard)/sizeof(szWildcard[0]);
		DWORD cbCurDir = GetCurrentDirectory(MAX_PATH - cchWildcard, szDir);
		if (!cbCurDir || cbCurDir >= (MAX_PATH - cchWildcard))
			return E_FAIL;
		lstrcat(szDir, szWildcard);
		hFile = FindFirstFile(szDir, &wf);
		if (hFile == INVALID_HANDLE_VALUE)
			return E_FAIL; // 用户没有 c:\ 驱动器
		FindClose(hFile);
		lstrcpynW(trData.m_szTable, CT2WEX<MAX_PATH + 1>(szDir), SIZEOF_MEMBER(CTABLESRow, m_szTable));
		if (!m_rgRowData.Add(trData))
			return E_OUTOFMEMORY;
		*pcRowsAffected = 1;
		return S_OK;
	}

	DBSTATUS GetDBStatus(CSimpleRow*, ATLCOLUMNINFO* pInfo)
	{
		if (pInfo->iOrdinal == 1 || pInfo->iOrdinal == 2)
			return DBSTATUS_S_ISNULL;
		return DBSTATUS_S_OK;
	}
};


class CmyProviderSessionColSchemaRowset : 
	public CSchemaRowsetImpl< CmyProviderSessionColSchemaRowset, CCOLUMNSRow, CmyProviderSession>
{
public:
BEGIN_PROPSET_MAP(CmyProviderSessionColSchemaRowset)
	BEGIN_PROPERTY_SET(DBPROPSET_ROWSET)
		PROPERTY_INFO_ENTRY(IAccessor)
		PROPERTY_INFO_ENTRY(IColumnsInfo)
		PROPERTY_INFO_ENTRY(IConvertType)
		PROPERTY_INFO_ENTRY(IRowset)
		PROPERTY_INFO_ENTRY(IRowsetIdentity)
		PROPERTY_INFO_ENTRY(IRowsetInfo)
		PROPERTY_INFO_ENTRY(CANFETCHBACKWARDS)
		PROPERTY_INFO_ENTRY(CANHOLDROWS)
		PROPERTY_INFO_ENTRY(CANSCROLLBACKWARDS)
		PROPERTY_INFO_ENTRY_VALUE(MAXOPENROWS, 0)
		PROPERTY_INFO_ENTRY_VALUE(MAXROWS, 0)
	END_PROPERTY_SET(DBPROPSET_ROWSET)
END_PROPSET_MAP()

	HRESULT Execute(LONG* pcRowsAffected, ULONG, const VARIANT*)
	{
		CmyProviderWindowsFile wf;
		HANDLE hFile = INVALID_HANDLE_VALUE;
		TCHAR szDir[MAX_PATH + 1];
		TCHAR szWildcard[] = _T("\\*.*");
		DWORD cchWildcard = sizeof(szWildcard)/sizeof(szWildcard[0]);
		DWORD cbCurDir = GetCurrentDirectory(MAX_PATH - cchWildcard, szDir);
		if (!cbCurDir || cbCurDir >= (MAX_PATH - cchWildcard))
			return E_FAIL;
		lstrcat(szDir, szWildcard);
		hFile = FindFirstFile(szDir, &wf);
		if (hFile == INVALID_HANDLE_VALUE)
			return E_FAIL; // 用户没有 c:\ 驱动器
		FindClose(hFile);// szDir 已获得表名称

		DBID dbid;
		memset(&dbid, 0, sizeof(DBID));
		CT2WEX<MAX_PATH + 1> wszDir(szDir);
		dbid.uName.pwszName = wszDir;
		dbid.eKind = DBKIND_NAME;
		return InitFromRowset < _RowsetArrayType > (m_rgRowData, &dbid, NULL, m_spUnkSite, pcRowsAffected);
	}
	DBSTATUS GetDBStatus(CSimpleRow*, ATLCOLUMNINFO* pInfo)
	{
		switch(pInfo->iOrdinal)
		{
		case 1:
		case 2:
		case 19:
		case 20:
		case 22:
		case 23:
		case 25:
		case 26:
			return DBSTATUS_S_ISNULL;
		default:
			return DBSTATUS_S_OK;
		}

	}
};

class CmyProviderSessionPTSchemaRowset : 
	public CSchemaRowsetImpl< CmyProviderSessionPTSchemaRowset, CPROVIDER_TYPERow, CmyProviderSession>
{
public:
BEGIN_PROPSET_MAP(CmyProviderSessionPTSchemaRowset)
	BEGIN_PROPERTY_SET(DBPROPSET_ROWSET)
		PROPERTY_INFO_ENTRY(IAccessor)
		PROPERTY_INFO_ENTRY(IColumnsInfo)
		PROPERTY_INFO_ENTRY(IConvertType)
		PROPERTY_INFO_ENTRY(IRowset)
		PROPERTY_INFO_ENTRY(IRowsetIdentity)
		PROPERTY_INFO_ENTRY(IRowsetInfo)
		PROPERTY_INFO_ENTRY(CANFETCHBACKWARDS)
		PROPERTY_INFO_ENTRY(CANHOLDROWS)
		PROPERTY_INFO_ENTRY(CANSCROLLBACKWARDS)
		PROPERTY_INFO_ENTRY_VALUE(MAXOPENROWS, 0)
		PROPERTY_INFO_ENTRY_VALUE(MAXROWS, 0)
	END_PROPERTY_SET(DBPROPSET_ROWSET)
END_PROPSET_MAP()

	HRESULT Execute(LONG* pcRowsAffected, ULONG, const VARIANT*)
	{
		return S_OK;
	}
};

⌨️ 快捷键说明

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