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

📄 grantprivilegesforsdeuser.cpp

📁 一个实用的GIS系统的系统维护模块
💻 CPP
字号:
// GrantPrivilegesForSDEUser.cpp: implementation of the GrantPrivilegesForSDEUser class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "yhgl.h"
#include "GrantPrivilegesForSDEUser.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
#include <iostream.h>

CString DBSDE::server;
CString DBSDE::instance;
CString DBSDE::database;
CString DBSDE::user;
CString DBSDE::password;
CString DBSDE::version;

IWorkspacePtr DBSDE::g_pSDEWorkspace;

IWorkspacePtr getSDEWorkspace(LPCTSTR server,LPCTSTR instance,LPCTSTR database,LPCTSTR user,LPCTSTR password,LPCTSTR version)
{
	//===================== 建立SDE数据库 ======================
	IWorkspaceFactoryPtr    pSDEWSF(CLSID_SdeWorkspaceFactory);
	IPropertySetPtr         pPropset(CLSID_PropertySet);
	IWorkspacePtr			  pWorkspace;
	
	CComVariant vserver(server);
	CComVariant vinstance(instance);
	CComVariant vdatabase(database);
	CComVariant vuser(user);
	CComVariant vpassword(password);
	CComVariant vversion(L"sde.DEFAULT");
	
	//打开SDE数据库的workspace
	pPropset->SetProperty (L"Server", vserver);
	pPropset->SetProperty (L"Instance", vinstance);
	pPropset->SetProperty (L"Database", vdatabase);
	pPropset->SetProperty (L"user", vuser);
	pPropset->SetProperty (L"password", vpassword);
	pPropset->SetProperty (L"version", vversion);
	
	HRESULT hr = pSDEWSF->Open (pPropset,0L,&pWorkspace);
	if (!SUCCEEDED(hr))
	{
		AfxMessageBox("不能获得相应的SDE数据库!");
		return NULL;
	}
	
	return pWorkspace;
}		

//登陆时将SDE的登陆注册信息存储到静态变量,以便后续使用
void DBSDE::InitSDELoginSetting (LPCTSTR s,LPCTSTR ins,LPCTSTR db,LPCTSTR user,LPCTSTR pwd,LPCTSTR ver)
{
	DBSDE::server = s;
	DBSDE::instance = ins;
	DBSDE::database = db;
	DBSDE::user = user;
	DBSDE::password = pwd;
	DBSDE::version = ver;
}

BOOL DBSDE::IsSDEConnected()
{
	return !(DBSDE::g_pSDEWorkspace == NULL);
}

// grantPrivileges:  grant or revoke privileges on an object in a workspace
//
IWorkspacePtr DBSDE::ConnectSDE()
{
	return DBSDE::g_pSDEWorkspace = getSDEWorkspace (DBSDE::server,DBSDE::instance,DBSDE::database,DBSDE::user,DBSDE::password,DBSDE::version);
}

//设置用户权限
//targetuser是需要设置的用户名 owner是拥有较高权限的用户名
//dataset需要设置的数据集 
//privs = "1"只读 "2"读写
BOOL GrantPrivileges(LPCTSTR targetuser, LPCTSTR dataset, LPCTSTR privs, LPCTSTR owner, IWorkspace * pInWorkspace)
{
	if (pInWorkspace == 0) return FALSE;

	CString dscode(dataset);

	//过滤数据集代码,目前只支持矢量数据集
	TCHAR dsClassTag;
	dsClassTag = dscode[7];
	if (dsClassTag != '1') return TRUE;

	HRESULT hr;
	IEnumDatasetNamePtr ipDSNames;
	IDatasetNamePtr ipDatasetName;
	ISQLPrivilegePtr ipSQLPriv;
	ISchemaLockPtr ipSLock;
	INamePtr ipName;
	IDatasetPtr ipDataset;
	IUnknownPtr ipUnknown;
	CComBSTR bsName;

	// UCase everthing for string comparison
	CComBSTR bsUser(targetuser);
	CComBSTR bsPrivs(privs);
	CComBSTR bsOwer(owner);
	bsOwer.Append(".");
	bsOwer.Append(dataset);
	bsOwer.ToUpper();
	
	if (FAILED(hr = pInWorkspace->get_DatasetNames(esriDTAny, &ipDSNames)))
		return FALSE;

	// get an enumeration of all of the datasets in the workspace and grant/revoke on the one specfied
	while (ipDSNames->Next(&ipDatasetName) == S_OK)
	{
	  ipDatasetName->get_Name(&bsName);
	  bsName.ToUpper();

	  if (bsName == bsOwer)
	  {
		// get a schema lock
		ipName = ipDatasetName;
		ipName->Open(&ipUnknown);
		ipDataset = ipUnknown;
		ipSLock = ipDataset;
		if (FAILED(hr = ipSLock->ChangeSchemaLock(esriExclusiveSchemaLock)))
			return hr;

		// revoke everything
		ipSQLPriv = ipDatasetName;
		
		hr = ipSQLPriv->Revoke(bsUser, esriDeletePrivilege);
		if (hr != 0 && hr != -2147216018) return FALSE;
		
		hr = ipSQLPriv->Revoke(bsUser, esriUpdatePrivilege);
		if (hr != 0 && hr != -2147216018) return FALSE;
		
		hr = ipSQLPriv->Revoke(bsUser, esriInsertPrivilege);
		if (hr != 0 && hr != -2147216018) return FALSE;
		
		hr = ipSQLPriv->Revoke(bsUser, esriSelectPrivilege);
		if (hr != 0 && hr != -2147216018) return FALSE;
		
		// now do the grant
		if (bsPrivs == _T("2"))
		{
			if (FAILED(hr = ipSQLPriv->Grant(bsUser,esriSelectPrivilege,VARIANT_FALSE)))
				return FALSE;
			if (FAILED(hr = ipSQLPriv->Grant(bsUser,esriUpdatePrivilege,VARIANT_FALSE)))
				return FALSE;
			if (FAILED(hr = ipSQLPriv->Grant(bsUser,esriInsertPrivilege,VARIANT_FALSE)))
				return FALSE;
			if (FAILED(hr = ipSQLPriv->Grant(bsUser,esriDeletePrivilege,VARIANT_FALSE)))
				return FALSE;
		} 
		else if (bsPrivs == _T("1"))
		{
			if (FAILED(hr = ipSQLPriv->Grant(bsUser,esriSelectPrivilege,VARIANT_FALSE)))
				return FALSE;
		}
		if (FAILED(hr = ipSLock->ChangeSchemaLock(esriSharedSchemaLock)))
				return FALSE;

		return TRUE;
	  }
	}
	return FALSE;
}

⌨️ 快捷键说明

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