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

📄 sdbms.cpp

📁 使用yacc的一个例子
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/*	//重新设置所有用户的m_pos
	POSITION pos = m_UserList.GetHeadPosition();
	while (pos != NULL)
	{
		CSdbms_User *pUser = m_UserList.GetNext(pos);
		pUser->m_pos = NULL;
	}
*/
//	m_nMaxDBID++;									//创建新数据库,并加入到数据库链表中
	CSdbms_Database	*pDatabase;
	pDatabase = new CSdbms_Database(strDatabaseName, m_nMaxDBID++, strDatabaseName+".db", m_pCurUser);
	pDatabase->m_bInit = true;
	m_DBList.AddTail(pDatabase);
	m_pCurDB = pDatabase;		//当前数据库为新建的数据库

	//设置审计记录中操作成功属性为真
	if	(bAuditSuccess)
		m_audit.SetOperateSuccess();

	sprintf(g_strMsg, "创建新数据库%s成功", strDatabaseName);
	g_msg.ThrowSuccessMsg(g_strMsg);

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

	return	TRUE;
}

/**********************************************************************
功能:删除数据库
***********************************************************************/
BOOL CSdbms::DoDropDatabase(CString strDatabaseName)
{
	ASSERT(m_pCurUser);

	//审计
	BOOL bAuditSuccess = m_audit.Audit(m_pCurUser, SR_DROP_DATABASE, m_pCurDB);

	//判断当前用户是否有权执行Drop Database命令
	if	(!HaveSystemRight(SR_DROP_DATABASE, m_pCurUser, NULL))
		return	FALSE;

	CSdbms_Database *pDB = NULL;
	POSITION prepos, pos=m_DBList.GetHeadPosition();
	while (pos != NULL)
	{
		prepos = pos;
		pDB = m_DBList.GetNext(pos);
		if	(strDatabaseName.CompareNoCase(pDB->m_strDBName) == 0)	//检查数据库名是否存在
		{
			m_DBList.RemoveAt(prepos);			//从全局数据库链表中删去该数据库指针
			delete pDB;							//释放数据库占的空间

			//设置审计记录中操作成功属性为真
			if	(bAuditSuccess)
				m_audit.SetOperateSuccess();

			sprintf(g_strMsg, "删除数据库%s成功", strDatabaseName);
			g_msg.ThrowSuccessMsg(g_strMsg);
			return	TRUE;
		}
	}

	ASSERT(pos == NULL);
	ASSERT(strDatabaseName.CompareNoCase(pDB->m_strDBName) != 0);
	
	sprintf(g_strMsg, "数据库%s不存在", strDatabaseName);
	g_msg.ThrowErrorMsg(g_strMsg);

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

	return	FALSE;
}

/**********************************************************************
功能:创建新用户
***********************************************************************/
BOOL CSdbms::DoCreateUser(CString strUserName, CString strPassword, UINT nClass/*=2*/)
{
	ASSERT(m_pCurUser);

	//审计
	BOOL bAuditSuccess = m_audit.Audit(m_pCurUser, SR_CREATE_USER, m_pCurDB);

	//判断当前用户是否有权执行Create User命令
	if	(!HaveSystemRight(SR_CREATE_USER, m_pCurUser, NULL))
		return	FALSE;

	CSdbms_User *pTemp;
	if	(GetUser(strUserName, &pTemp))				//检查用户名是否已存在
	{
		sprintf(g_strMsg, "用户名%s已经存在", strUserName);
		g_msg.ThrowErrorMsg(g_strMsg);
		return	FALSE;
	}

	CSdbms_SecurityLevel slSecLevel;
	slSecLevel.m_nClassifaction = (nClass > 3) ? 3:nClass;
	slSecLevel.m_nClassifaction = (nClass < 0) ? 0:slSecLevel.m_nClassifaction;
	slSecLevel.m_nRangeCount = 0;

	//只有DBSA才能给用户设置新的安全级
	if	(!IsOwnDbsaRole(m_pCurUser->m_nUserID))
	{
		if	(slSecLevel.m_nClassifaction != 2)
			slSecLevel.m_nClassifaction = 2;
	}

//	m_nMaxUserID++;									//创建新用户,并加入到用户链表中
	CSdbms_User	*pUser = new CSdbms_User(strUserName, m_nMaxUserID++, strPassword, slSecLevel);
	m_UserList.AddTail(pUser);

	//设置审计记录中操作成功属性为真
	if	(bAuditSuccess)
		m_audit.SetOperateSuccess();

	sprintf(g_strMsg, "创建新用户%s成功", strUserName);
	g_msg.ThrowSuccessMsg(g_strMsg);

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

	return	TRUE;
}


/**********************************************************************
功能:删除用户
***********************************************************************/
BOOL CSdbms::DoDropUser(CString strUserName)
{
	ASSERT(m_pCurUser);

	//审计
	BOOL bAuditSuccess = m_audit.Audit(m_pCurUser, SR_DROP_USER, m_pCurDB);

	//不能删除dba用户
	if	(strUserName.CompareNoCase(SYSTEM_ROLE_DBA) == 0)
	{
		sprintf(g_strMsg, "用户%s无权删除用户dba", m_pCurUser->m_strUserName);
		g_msg.ThrowErrorMsg(g_strMsg);
		return	FALSE;
	}

	//不能删除当前用户
	if	(strUserName.CompareNoCase(m_pCurUser->m_strUserName) == 0)
	{
		sprintf(g_strMsg, "用户%s不能删除自身", m_pCurUser->m_strUserName);
		g_msg.ThrowErrorMsg(g_strMsg);
		return	FALSE;
	}

	//判断当前用户是否有权执行Drop User命令
	if	(!HaveSystemRight(SR_DROP_USER, m_pCurUser, NULL))
		return	FALSE;

	CSdbms_User *pUser = NULL;
	POSITION prepos, pos = m_UserList.GetHeadPosition();
	while (pos != NULL)
	{
		prepos = pos;
		pUser = m_UserList.GetNext(pos);
		if	(strUserName.CompareNoCase(pUser->m_strUserName) == 0)	//检查用户是否存在
		{
			m_UserList.RemoveAt(prepos);			//从全局用户链表中删去该用户指针
			break;
		}
	}

	if	(strUserName.CompareNoCase(pUser->m_strUserName) != 0)
	{
		sprintf(g_strMsg, "用户%s不存在", strUserName);
		g_msg.ThrowErrorMsg(g_strMsg);
		return	FALSE;
	}

	//遍历数据库,删除用户有数据库中的相关信息
	pos = m_DBList.GetHeadPosition();			
	while (pos != NULL)
	{
		CSdbms_Database *pDB = m_DBList.GetNext(pos);
		if	(!pDB->m_bInit)				//如果DB还没初始化,要读它的数据字典进行初始化
			pDB->Init();
		pDB->DeleteUser(pUser);
	}

	//删除用户与系统预定义角色的关系
	pos = m_RoleUserList.GetHeadPosition();
	while (pos != NULL)
	{
		POSITION prepos = pos;
		CSdbms_RoleUser *pRoleUser = m_RoleUserList.GetNext(pos);
		if	(pRoleUser->m_pUser == pUser)
		{
			m_RoleUserList.RemoveAt(prepos);
			delete pRoleUser;
		}
	}

	if	(pUser->m_nUserID == m_nMaxUserID-1)
		m_nMaxUserID--;

	delete	pUser;			//删除用户信息

	//设置审计记录中操作成功属性为真
	if	(bAuditSuccess)
		m_audit.SetOperateSuccess();

	sprintf(g_strMsg, "删除用户%s成功", strUserName);
	g_msg.ThrowSuccessMsg(g_strMsg);

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

	return	TRUE;

}


/**********************************************************************
功能:为当前连接的数据库创建新的角色
***********************************************************************/
BOOL CSdbms::DoCreateRole(CString strRoleName)
{
	ASSERT(m_pCurUser);

	//审计
	BOOL bAuditSuccess = m_audit.Audit(m_pCurUser, SR_CREATE_ROLE, m_pCurDB);

	CantUseRoleName(strRoleName, SYSTEM_ROLE_SYSTEM);		//不能使用系统定义的角色名
	CantUseRoleName(strRoleName, SYSTEM_ROLE_DBSA);
	CantUseRoleName(strRoleName, SYSTEM_ROLE_DBA);
	CantUseRoleName(strRoleName, SYSTEM_ROLE_LOGIN);
	CantUseRoleName(strRoleName, SYSTEM_ROLE_GUEST);
	CantUseRoleName(strRoleName, SYSTEM_ROLE_OWNER);

	//检查当前是否有连接的数据库
	if	(m_pCurDB == NULL)
	{
		g_msg.ThrowErrorMsg("当前没有数据库被打开");
		return	FALSE;
	}

	ASSERT(m_pCurDB->m_bInit && m_pCurDB->m_pRole);

	//判断当前用户是否有权执行Create Role命令
	if	(!HaveSystemRight(SR_CREATE_ROLE, m_pCurUser, m_pCurDB))
		return	FALSE;

	if	(m_pCurDB->CreateRole(strRoleName))
	{
		//设置审计记录中操作成功属性为真
		if	(bAuditSuccess)
			m_audit.SetOperateSuccess();

		//通知界面更新数据
		g_msg.UpdateRole();
	
		return	TRUE;
	}
	else
		return	FALSE;
}


/**********************************************************************
功能:从当前连接的数据库中删除一角色
***********************************************************************/
BOOL CSdbms::DoDropRole(CString strRoleName)
{
	ASSERT(m_pCurUser);

	//审计
	BOOL bAuditSuccess = m_audit.Audit(m_pCurUser, SR_DROP_ROLE, m_pCurDB);

	CantUseRoleName(strRoleName, SYSTEM_ROLE_SYSTEM);		//不能使用系统定义的角色名
	CantUseRoleName(strRoleName, SYSTEM_ROLE_DBSA);
	CantUseRoleName(strRoleName, SYSTEM_ROLE_DBA);
	CantUseRoleName(strRoleName, SYSTEM_ROLE_LOGIN);
	CantUseRoleName(strRoleName, SYSTEM_ROLE_GUEST);
	CantUseRoleName(strRoleName, SYSTEM_ROLE_OWNER);

	//检查当前是否有连接的数据库
	if	(m_pCurDB == NULL)
	{
		g_msg.ThrowErrorMsg("当前没有数据库被打开");
		return	FALSE;
	}

	ASSERT(m_pCurDB->m_bInit && m_pCurDB->m_pRole);

	//判断当前用户是否有权执行Drop Role命令
	if	(!HaveSystemRight(SR_DROP_ROLE, m_pCurUser, m_pCurDB))
		return	FALSE;

	if	(m_pCurDB->DropRole(strRoleName))
	{
		//设置审计记录中操作成功属性为真
		if	(bAuditSuccess)
			m_audit.SetOperateSuccess();

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

		return	TRUE;
	}
	else
		return	FALSE;
}


/**********************************************************************
功能:在当前连接的数据库中设置一个角色为另一个角色的父角色
***********************************************************************/
BOOL CSdbms::DoSetParentRole(CString strParentRoleName, CString strChildRoleName)
{
	ASSERT(m_pCurUser);

	//审计
	BOOL bAuditSuccess = m_audit.Audit(m_pCurUser, SR_SET_PARENT_ROLE, m_pCurDB);

	CantUseRoleName(strChildRoleName, SYSTEM_ROLE_SYSTEM);		//不能使用系统定义的角色名
	CantUseRoleName(strChildRoleName, SYSTEM_ROLE_DBSA);
	CantUseRoleName(strChildRoleName, SYSTEM_ROLE_DBA);
	CantUseRoleName(strChildRoleName, SYSTEM_ROLE_LOGIN);
	CantUseRoleName(strChildRoleName, SYSTEM_ROLE_GUEST);
	CantUseRoleName(strChildRoleName, SYSTEM_ROLE_OWNER);
	CantUseRoleName(strParentRoleName, SYSTEM_ROLE_SYSTEM);		//不能使用系统定义的角色名
	CantUseRoleName(strParentRoleName, SYSTEM_ROLE_DBSA);
	CantUseRoleName(strParentRoleName, SYSTEM_ROLE_DBA);
	CantUseRoleName(strParentRoleName, SYSTEM_ROLE_LOGIN);
	CantUseRoleName(strParentRoleName, SYSTEM_ROLE_GUEST);
	CantUseRoleName(strParentRoleName, SYSTEM_ROLE_OWNER);

	//检查当前是否有连接的数据库
	if	(m_pCurDB == NULL)
	{
		g_msg.ThrowErrorMsg("当前没有数据库被打开");
		return	FALSE;
	}

	ASSERT(m_pCurDB->m_bInit && m_pCurDB->m_pRole);

	//判断当前用户是否有权执行Set Parent Role命令
	if	(!HaveSystemRight(SR_SET_PARENT_ROLE, m_pCurUser, m_pCurDB))
		return	FALSE;

	if	(m_pCurDB->SetParentRole(strParentRoleName, strChildRoleName))
	{
		//设置审计记录中操作成功属性为真
		if	(bAuditSuccess)
			m_audit.SetOperateSuccess();

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

		return	TRUE;
	}
	else
		return	FALSE;
}


/**********************************************************************
功能:在当前连接的数据库中设置一个角色为另一个角色的子角色
***********************************************************************/
BOOL CSdbms::DoSetChildRole(CString strParentRoleName, CString strChildRoleName)
{
	ASSERT(m_pCurUser);

	//审计
	BOOL bAuditSuccess = m_audit.Audit(m_pCurUser, SR_SET_CHILD_ROLE, m_pCurDB);

	CantUseRoleName(strParentRoleName, SYSTEM_ROLE_SYSTEM);		//不能使用系统定义的角色名
	CantUseRoleName(strParentRoleName, SYSTEM_ROLE_DBSA);
	CantUseRoleName(strParentRoleName, SYSTEM_ROLE_DBA);
	CantUseRoleName(strParentRoleName, SYSTEM_ROLE_LOGIN);
	CantUseRoleName(strParentRoleName, SYSTEM_ROLE_GUEST);
	CantUseRoleName(strParentRoleName, SYSTEM_ROLE_OWNER);
	CantUseRoleName(strChildRoleName, SYSTEM_ROLE_SYSTEM);		//不能使用系统定义的角色名
	CantUseRoleName(strChildRoleName, SYSTEM_ROLE_DBSA);
	CantUseRoleName(strChildRoleName, SYSTEM_ROLE_DBA);
	CantUseRoleName(strChildRoleName, SYSTEM_ROLE_LOGIN);
	CantUseRoleName(strChildRoleName, SYSTEM_ROLE_GUEST);
	CantUseRoleName(strChildRoleName, SYSTEM_ROLE_OWNER);

	//检查当前是否有连接的数据库
	if	(m_pCurDB == NULL)
	{
		g_msg.ThrowErrorMsg("当前没有数据库被打开");
		return	FALSE;
	}

	ASSERT(m_pCurDB->m_bInit && m_pCurDB->m_pRole);

⌨️ 快捷键说明

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