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

📄 sdbms.cpp

📁 使用yacc的一个例子
💻 CPP
📖 第 1 页 / 共 5 页
字号:
#include "stdafx.h"
#include "SqlMsg.h"
#include "sdbms.h"

extern CSqlMessage	g_msg;
extern char g_strMsg[1000];
extern char *g_strSystemRight[];
extern char *g_strObjectRight[];

/*类 -- CSdbms**********************************************************************/
/**********************************************************************
功能:初始化
***********************************************************************/
CSdbms::CSdbms()
{
	m_pSystemRole	=	NULL;
	m_pDbsaRole		=	NULL;
	m_pDbaRole		=	NULL;
	m_pCurUser		=	NULL;
	m_pCurDB		=	NULL;
	m_nMaxUserID	=	0;
	m_nMaxDBID		=	0;
}


/**********************************************************************
功能:释放内存
***********************************************************************/
CSdbms::~CSdbms()
{
	ReleaseMemory();
}

/**********************************************************************
功能:初始化系统数据
算法:从磁盘读全局数据字典
	  初始化用户表
	  初始化数据库表(没有具体初始化每个数据库)
	  初始化SYSTEM、DBSA和DBA三个系统角色
	  初始化全局系统角色用户关系表
***********************************************************************/
BOOL CSdbms::InitSystem(void)
{
	//先释放内存
	ReleaseMemory();

	//现在是手工的把dba用户加到用户表中,本应是从磁盘读取的
	CSdbms_SecurityLevel seclevel;
	seclevel.m_nClassifaction = 3;	//最大密级
	seclevel.m_nRangeCount = 0;		//没有分层范围

	//初始化SYSTEM,DBSA,DBA角色
	m_pSystemRole = new CSdbms_Role(SYSTEM_ROLE_SYSTEM, ROLE_SYSTEM);
	m_pDbsaRole	= new CSdbms_Role(SYSTEM_ROLE_DBSA, ROLE_DBSA);
	m_pDbaRole = new CSdbms_Role(SYSTEM_ROLE_DBA, ROLE_DBA);

	//建对象权限表,每个系统预定义角色只有一个对象权限结点,记录被授予的角色
	m_pSystemRole->m_ORList.AddHead(new CSdbms_RoleObjectRight);
	m_pDbsaRole->m_ORList.AddHead(new CSdbms_RoleObjectRight);
	m_pDbaRole->m_ORList.AddHead(new CSdbms_RoleObjectRight);

	//用户名(SYSTEM_USER_DBA),口令(dragon),用户内码(0)
	CSdbms_User *pUser = new CSdbms_User(SYSTEM_USER_DBA, m_nMaxUserID++, "dragon", seclevel);
	m_UserList.AddTail(pUser);

	//现在是手工的建立角色用户关系表,本应是从磁盘读取的
	CSdbms_RoleUser *pRoleUser = new CSdbms_RoleUser;
	pRoleUser->m_pRole = m_pDbaRole;
	pRoleUser->m_pUser = pUser;
	m_RoleUserList.AddTail(pRoleUser);	//(dba, DBA)

	//用户名(SYSTEM_USER_DBSA),口令(dragon),用户内码(1)
	pUser = new CSdbms_User(SYSTEM_USER_DBSA, m_nMaxUserID++, "dragon", seclevel);
	m_UserList.AddTail(pUser);

	//现在是手工的建立角色用户关系表,本应是从磁盘读取的
	pRoleUser = new CSdbms_RoleUser;
	pRoleUser->m_pRole = m_pDbsaRole;
	pRoleUser->m_pUser = pUser;
	m_RoleUserList.AddTail(pRoleUser);	//(dbsa, DBSA)

	//通知界面更新数据
	g_msg.UpdateUser();
	g_msg.UpdateRole();
	g_msg.UpdateTable();

	return	TRUE;
}

/**********************************************************************
功能:删除若干个用户
***********************************************************************/
BOOL CSdbms::PreDropUser(CString strUserNames)
{
	int	nUserCount=0;
	CString strUserName[100];

	//从字符串中分解出用户数组
	nUserCount = ParseStrings(strUserNames, strUserName);

	for	(int i=0; i<nUserCount; i++)
		DoDropUser(strUserName[i]);

	return	TRUE;
}

/**********************************************************************
功能:删除若干个角色
***********************************************************************/
BOOL CSdbms::PreDropRole(CString strRoleNames)
{
	int	nRoleCount=0;
	CString strRoleName[100];

	//从字符串中分解出子角色数组
	nRoleCount = ParseStrings(strRoleNames, strRoleName);

	for	(int i=0; i<nRoleCount; i++)
		DoDropRole(strRoleName[i]);

	return	TRUE;
}

/**********************************************************************
功能:把某个角色设为若干个角色的父角色
***********************************************************************/
BOOL CSdbms::PreSetParentRole(CString strParentRoleName, CString strChildRoleNames)
{
	int	nRoleCount=0;
	CString strChildRoleName[100];

	//从字符串中分解出子角色数组
	nRoleCount = ParseStrings(strChildRoleNames, strChildRoleName);

	for	(int i=0; i<nRoleCount; i++)
		DoSetParentRole(strParentRoleName, strChildRoleName[i]);

	return	TRUE;
}

/**********************************************************************
功能:把若干个角色设为某个角色的子角色
***********************************************************************/
BOOL CSdbms::PreSetChildRole(CString strParentRoleName, CString strChildRoleNames)
{
	int	nRoleCount=0;
	CString strChildRoleName[100];

	//从字符串中分解出子角色数组
	nRoleCount = ParseStrings(strChildRoleNames, strChildRoleName);

	for	(int i=0; i<nRoleCount; i++)
		DoSetChildRole(strParentRoleName, strChildRoleName[i]);

	return	TRUE;
}

/**********************************************************************
功能:把若干个角色设为顶层角色
***********************************************************************/
BOOL CSdbms::PreSetTopRole(CString strRoleNames)
{
	int	nRoleCount=0;
	CString strRoleName[100];

	//从字符串中分解出角色数组
	nRoleCount = ParseStrings(strRoleNames, strRoleName);

	for	(int i=0; i<nRoleCount; i++)
		DoSetTopRole(strRoleName[i]);

	return	TRUE;
}

/**********************************************************************
功能:把若干个用户加入到若干个角色中
***********************************************************************/
BOOL CSdbms::PreAddUserToRole(CString strUserNames, CString strRoleNames)
{
	int	nUserCount=0, nRoleCount=0;
	CString strUserName[100], strRoleName[100];

	//从字符串中分解出用户
	nUserCount = ParseStrings(strUserNames, strUserName);

	//从字符串中分解出角色
	nRoleCount = ParseStrings(strRoleNames, strRoleName);

	for	(int i=0; i<nUserCount; i++)
		for (int j=0; j<nRoleCount; j++)
			DoAddUserToRole(strUserName[i], strRoleName[j]);

	return	TRUE;
}

/**********************************************************************
功能:把若干个用户从若干个角色中删除
***********************************************************************/
BOOL CSdbms::PreDelUserFromRole(CString strUserNames, CString strRoleNames)
{
	int	nUserCount=0, nRoleCount=0;
	CString strUserName[100], strRoleName[100];

	//从字符串中分解出用户
	nUserCount = ParseStrings(strUserNames, strUserName);

	//从字符串中分解出角色
	nRoleCount = ParseStrings(strRoleNames, strRoleName);

	for	(int i=0; i<nUserCount; i++)
		for (int j=0; j<nRoleCount; j++)
			DoDelUserFromRole(strUserName[i], strRoleName[j]);

	return	TRUE;
}

/**********************************************************************
功能:改变若干个用户的角色为指定的若干个角色
***********************************************************************/
BOOL CSdbms::PreChangeRole(CString strUserNames, CString strRoleNames)
{
	int	nUserCount=0;
	CString strUserName[100];

	//从字符串中分解出用户
	nUserCount = ParseStrings(strUserNames, strUserName);

	for	(int i=0; i<nUserCount; i++)
		DoChangeRole(strUserName[i], strRoleNames);

	return	TRUE;
}

/**********************************************************************
功能:把若干个系统权限授权给若干个角色
***********************************************************************/
BOOL CSdbms::PreGrant(CString strSystemRights, CString strRoleNames)
{
	int	nRightCount=0, nRoleCount=0;
	CString strSystemRight[100], strRoleName[100];
	SystemRight	nSystemRight[100];

	//从字符串中分解出权限
	nRightCount = ParseStrings(strSystemRights, strSystemRight);
	for	(int i=0; i<nRightCount; i++)
	{
		nSystemRight[i] = (SystemRight)atoi(strSystemRight[i]);
	}

	//从字符串中分解出角色
	nRoleCount = ParseStrings(strRoleNames, strRoleName);

	for	(i=0; i<nRightCount; i++)
		for (int j=0; j<nRoleCount; j++)
			DoGrant(nSystemRight[i], strRoleName[j]);

	return	TRUE;
}

/**********************************************************************
功能:收回被授予在若干个角色上的若干个系统权限
***********************************************************************/
BOOL CSdbms::PreRevoke(CString strSystemRights, CString strRoleNames)
{
	int	nRightCount=0, nRoleCount=0;
	CString strSystemRight[100], strRoleName[100];
	SystemRight	nSystemRight[100];

	//从字符串中分解出权限
	nRightCount = ParseStrings(strSystemRights, strSystemRight);
	for	(int i=0; i<nRightCount; i++)
	{
		nSystemRight[i] = (SystemRight)atoi(strSystemRight[i]);
	}

	//从字符串中分解出角色
	nRoleCount = ParseStrings(strRoleNames, strRoleName);

	for	(i=0; i<nRightCount; i++)
		for (int j=0; j<nRoleCount; j++)
			DoRevoke(nSystemRight[i], strRoleName[j]);

	return	TRUE;
}

/**********************************************************************
功能:把对某个表上的若干列的某操作权限授予给若干个角色
***********************************************************************/
BOOL CSdbms::PreGrant(ObjectRight nObjectRight, CString strTableName, CString strFieldNames, 
					  CString strRoleNames, BOOL bCanGrant/*=FALSE*/, CSdbms_Condition *pCondition/*=NULL*/)
{
	ASSERT(!strRoleNames.IsEmpty());

	int nRoleCount = 0, nFieldCount = 0;
	CString strFieldName[100], strRoleName[100];

	//从字符串中分解出角色
	nRoleCount = ParseStrings(strRoleNames, strRoleName);

	//从字符串中分解出列名
	if	(strFieldNames.IsEmpty())
	{
		nFieldCount = 1;
		strFieldName[0] = "";		//nCount2==1,且strFieldName[0]为空
	}
	else
		nFieldCount = ParseStrings(strFieldNames, strFieldName);

	for	(int i=0; i<nRoleCount; i++)
		for	(int j=0; j<nFieldCount; j++)
			DoGrant(nObjectRight, strTableName, strFieldName[j], strRoleName[i], bCanGrant, pCondition);
	
	return	TRUE;
}

/**********************************************************************
功能:收回被授予在若干个角色上的对某个表上的若干列的某操作权限
参数:nObjectRight	--对象权限ID
	 strTableName	--权限作用的表名
	 strFieldNames	--权限作用的表上的列名
	  strRoleNames	--被授权的角色名
	  bRevokeGrant	--是否只收回授予权限,而不收回权限本身
	  bRestrict		--如果为真表示如果要收回的权限已经授权给其他用户,则该语句不能执行
***********************************************************************/
BOOL CSdbms::PreRevoke(ObjectRight nObjectRight, CString strTableName, CString strFieldNames, 
		CString strRoleNames, BOOL bRevokeGrant/*=FALSE*/, BOOL bRestrict/*=FALSE*/, CSdbms_Condition *pCondition/*=NULL*/)
{
	ASSERT(!strRoleNames.IsEmpty());

	int nRoleCount = 0, nFieldCount = 0;
	CString strFieldName[100], strRoleName[100];

	//从字符串中分解出角色
	nRoleCount = ParseStrings(strRoleNames, strRoleName);

	//从字符串中分解出列名
	if	(strFieldNames.IsEmpty())
	{
		nFieldCount = 1;
		strFieldName[0] = "";		//nCount2==1,且strFieldName[0]为空
	}
	else
		nFieldCount = ParseStrings(strFieldNames, strFieldName);

	for	(int i=0; i<nRoleCount; i++)
		for	(int j=0; j<nFieldCount; j++)
			DoRevoke(nObjectRight, strTableName, strFieldName[j], strRoleName[i], bRevokeGrant, bRestrict, pCondition);
	
	return	TRUE;
}

/**********************************************************************
功能:准备设置用户最大安全级
***********************************************************************/
BOOL CSdbms::PreSetUserSecurityLevel(UINT nClassifaction, CString strUserNames)
{
	int nUserCount = 0;
	CString strUserName[100];

	//从字符串中分解出用户名
	nUserCount = ParseStrings(strUserNames, strUserName);

	for	(int i=0; i<nUserCount; i++)
		DoSetUserSecurityLevel(strUserName[i], nClassifaction);

	return	TRUE;
}

/**********************************************************************
功能:准备设置用户在表上的允许安全级
***********************************************************************/
BOOL CSdbms::PreSetAllowSecurityLevel(CSdbms_SecurityLevel *pSecLevel, CString strUserNames, CString strTableNames)
{
	ASSERT(pSecLevel);

	int	nUserCount=0, nTableCount=0;
	CString strUserName[100], strTableName[100];

	//从字符串中分解出用户
	nUserCount = ParseStrings(strUserNames, strUserName);

	//从字符串中分解出表名
	nTableCount = ParseStrings(strTableNames, strTableName);

	for	(int i=0; i<nUserCount; i++)
		for (int j=0; j<nTableCount; j++)
			DoSetAllowSecurityLevel(strUserName[i], strTableName[j], *pSecLevel);

	return	TRUE;
}

/**********************************************************************
功能:准备设置用户在表上的当前安全级
***********************************************************************/
BOOL CSdbms::PreSetCurrentSecurityLevel(CSdbms_SecurityLevel *pSecLevel, CString strUserNames, CString strTableNames)
{
	ASSERT(pSecLevel);

	int	nUserCount=0, nTableCount=0;
	CString strUserName[100], strTableName[100];

	//从字符串中分解出用户

⌨️ 快捷键说明

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