📄 sdbms.cpp
字号:
#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 + -