📄 sdbms_datastruct.h
字号:
CSdbms_Role *m_pFirstChildRole; //第一个子角色
POSITION m_pos; //角色在角色用户关系表中的索引位置,或是全局的或是DB级的或是表级的
public:
BOOL IsAncestorOf(CSdbms_Role *pChildRole); //是否是另一个角色的祖先
BOOL Grant(SystemRight nSystemRight, UINT nGrantUserID); //给角色增加一个系统权限
BOOL Revoke(SystemRight nSystemRight, UINT nGrantUserID); //给角色取消一个系统权限
BOOL Grant(ObjectRight nObjectRight, UINT nTableID, UINT nFieldID, CSdbms_RoleUser *pRoleUser,
BOOL bCanGrant = FALSE, CSdbms_Condition *pCondition = NULL); //给角色增加一个对象权限
BOOL Revoke(ObjectRight nObjectRight, UINT nTableID, UINT nFieldID, CSdbms_RoleUser *pRoleUser,
BOOL bRevokeGrant = FALSE, CSdbms_Condition *pCondition = NULL); //收回角色的一个对象权限
BOOL InsertORList(ObjectRight nObjectRight, UINT nTableID, UINT nFieldID,
CSdbms_RoleUser *pRoleUser, BOOL bCanGrant, CSdbms_Condition *pCondition); //把对象权限插入到角色-对象权限表中
BOOL RemoveORList(ObjectRight nObjectRight, UINT nTableID, UINT nFieldID,
CSdbms_RoleUser *pRoleUser, BOOL bRevokeGrant, CSdbms_Condition *pCondition); //把对象权限从角色-对象权限表删除
BOOL RemoveORList(ObjectRight nObjectRight, UINT nTableID, UINT nFieldID,
CSdbms_Role *pRole, BOOL bRevokeGrant, CSdbms_Condition *pCondition); //把由某个角色授权的对象权限从角色-对象权限表删除
// BOOL HaveSystemRight(SystemRight nSqlID); //该角色是否具有某系统权限
// BOOL HaveObjectRight(UINT nTableID, UINT nFieldID, ObjectRight nObjectRight, CSdbms_Condition *pCondition); //该角色是否具有某对象权限
// BOOL HaveObjectRight(UINT nTableID, UINT nFieldID, ObjectRight nObjectRight); //该角色是否具有某对象权限,不考虑与数值相关的条件
// BOOL HaveObjectRight(UINT nTableID, ObjectRight nObjectRight); //该角色是否具有某对象权限
POSITION FindSystemRight(SystemRight nSqlID); //查找某系统权限,返回在链表中的位置
POSITION FindObjectRight(UINT nTableID, UINT nFieldID, ObjectRight nObjectRight, CSdbms_Condition *pCondition); //查找某对象权限,返回在链表中的位置
POSITION FindObjectRight(UINT nTableID, UINT nFieldID, ObjectRight nObjectRight); //查找某对象权限(不考虑与数值相关的条件),返回在链表中的位置
POSITION FindObjectRight(UINT nTableID, ObjectRight nObjectRight); //查找某对象权限,返回在链表中的位置
BOOL HaveObjectRight(CSdbms_Table *pTable, CSdbms_Field *pField, ObjectRight nObjectRight, BYTE *pRecord); //该角色是否具有某对象权限,考虑与数值相关的条件
private:
};
//角色-用户表
class CSdbms_RoleUser
{
public:
CSdbms_RoleUser():m_pRole(NULL), m_pUser(NULL){}
~CSdbms_RoleUser(){}
CSdbms_Role *m_pRole;
CSdbms_User *m_pUser;
public:
// BOOL HaveUser(UINT nRoleID, UINT nUserID); //判断是否用户属于角色
// BOOL DeleteUser(UINT nRoleID, UINT nUserID); //从角色中删掉某用户
};
//角色-系统权限表
class CSdbms_RoleSystemRight
{
public:
CSdbms_RoleSystemRight(){}
~CSdbms_RoleSystemRight(){}
SystemRight m_nSqlID; //系统命令内码
CUIntArray m_FromUserArray; //授权该命令给该角色的用户ID表(该用户肯定是DBA)
//系统权限不能授给其他角色
// BOOL m_bCanGrant; //可否授权该命令
// CUIntArray m_ToRoleList; //把该命令授权给其他角色的ID表
};
//角色-对象权限表
class CSdbms_RoleObjectRight
{
public:
CSdbms_RoleObjectRight();
~CSdbms_RoleObjectRight();
// ObjectRightType m_nType; //命令的类型
UINT m_nTableID; //表内码
UINT m_nFieldID; //列内码
ObjectRight m_nSqlID; //对象权限 (ObjectRight型)
CSdbms_Condition* m_pCondition; //存取谓词的语法树指针
CTypedPtrArray<CPtrArray, CSdbms_RoleUser*> m_FromUserRoleArray; //授权该命令给该角色的用户角色表
CUIntArray m_CanGrantArray; //可否授权该命令(与m_FromUserRoleList一一对应,并且是BOOL类型)
CTypedPtrArray<CPtrArray, CSdbms_Role*> m_ToRoleArray; //被该角色授权的角色表
BOOL RemoveFromUserRoleArray(CSdbms_Role *pOwnerRole, CSdbms_RoleUser *pRoleUser, BOOL bRevokeGrant); //如果是pRoleUser授予的权限,删除之
BOOL RemoveFromUserRoleArray(CSdbms_Role *pOwnerRole, CSdbms_Role *pRole, BOOL bRevokeGrant); //如果是pRole授予的权限,删除之
BOOL InsertToRoleArray(CSdbms_Role *pRole); //把角色pRole插入到m_ToRoleArray中
BOOL RemoveToRoleArray(CSdbms_Role *pRole); //把角色pRole从m_ToRoleArray中删除
};
//表达式
class CSdbms_Express
{
public:
CSdbms_Express(int nValue);
CSdbms_Express(UINT nValue);
CSdbms_Express(bool bValue);
CSdbms_Express(char* strValue);
CSdbms_Express(CString strTableName, CString strFieldName, BOOL bSecLevel=FALSE);
CSdbms_Express(CSdbms_SecurityLevel* pSecLevel);
CSdbms_Express(OPCalc nCalc, CSdbms_Express *pLeft, CSdbms_Express *pRight);
CSdbms_Express(CSdbms_Express *pExpr);
~CSdbms_Express();
NodeType m_nNodeType; //结点类型
union
{
struct
{
DataType m_nDataType; //五种类型
union
{
int m_nValue;
char* m_strValue;
bool m_bValue;
CSdbms_SecurityLevel* m_pSecLevel;
struct
{
char* m_strTableName;
char* m_strFieldName;
BOOL m_bSecLevel; //表明是计算该列的安全级
}m_colref;
};
}m_leaf; //叶子结点
struct
{
OPCalc m_nCalc; //操作运算符
CSdbms_Express *m_pLeft; //左子树
CSdbms_Express *m_pRight; //右子树
}m_interior; //中间结点
};
CString GetFormatString(); //得到表达式的字符串表示
BOOL GetValue(int *pValue, CSdbms_Table *pTable=NULL, BYTE *pRecord=NULL, CSdbms_SecurityLevel *pSL=NULL); //计算int值
BOOL GetValue(char **ppValue, CSdbms_Table *pTable=NULL, BYTE *pRecord=NULL, CSdbms_SecurityLevel *pSL=NULL);//计算字符串值
BOOL GetValue(bool *pValue, CSdbms_Table *pTable=NULL, BYTE *pRecord=NULL, CSdbms_SecurityLevel *pSL=NULL); //计算BOOL值
BOOL GetValue(CSdbms_SecurityLevel *pValue, CSdbms_Table *pTable=NULL, BYTE *pRecord=NULL, CSdbms_SecurityLevel *pSL=NULL);//计算安全级值
DataType GetDataType(CSdbms_Table *pTable=NULL); //得到表达式的数据类型
UINT GetLength(CSdbms_Table *pTable=NULL); //得到表达式的长度
UINT GetColref(UINT nIndex, CString *strTableName, CString *strFieldName, CString strDefaultTableName); //得到引用的表/列名
void SetDefaultTableName(CString strDefaultTableName); //设置缺省的表名
BOOL Compare(OPComp nComp, CSdbms_Express *pRight, BOOL *pValue, BOOL *pCanComp,
CSdbms_Table *pTable=NULL, BYTE *pRecord=NULL, CSdbms_SecurityLevel *pSL=NULL);//与另一个表达式进行比较
BOOL Compare(CSdbms_Express *pExpr); //比较两个表达式是否相同(不是比较值)
BOOL PreTreat(void); //预处理,求出公共子表达式,并去掉无用结点
private:
BOOL PreTreat(int *pValue, BOOL *pCanComp); //针对数值型结点进行预处理
};
//条件表达式
class CSdbms_Condition
{
public:
CSdbms_Condition(OPComp nComp, CSdbms_Express *pLeft, CSdbms_Express *pRight);
CSdbms_Condition(OPConj nConj, CSdbms_Condition *pLeft, CSdbms_Condition *pRight);
CSdbms_Condition(CSdbms_Condition *pCondition);
~CSdbms_Condition();
NodeType m_nNodeType; //结点类型
union
{
struct
{
BOOL m_bConstant; //表明该叶子结点是否是常量
union
{
BOOL m_bValue; //该叶子结点是个常量布尔值
struct
{
OPComp m_nComp; //比较运算符
CSdbms_Express *m_pLeft; //左子树
CSdbms_Express *m_pRight; //右子树
};
};
}m_leaf; //叶子结点
struct
{
OPConj m_nConj; //连接运算符
CSdbms_Condition *m_pLeft; //左子树
CSdbms_Condition *m_pRight; //右子树
}m_interior; //中间结点
};
CString GetFormatString(); //得到字符串表示
BOOL GetValue(BOOL *pValue, BOOL *pCanComp, CSdbms_Table *pTable=NULL, BYTE *pRecord=NULL, CSdbms_SecurityLevel *pSL=NULL); //计算条件表达式的值
BOOL PreTreat(BOOL *pValue, BOOL *pCanComp); //预处理,求出公共子表达式,并删除无用结点
BOOL Compare(CSdbms_Condition *pCondition); //比较两个条件表达式是否相同(不是比较值)
void SetDefaultTableName(CString strDefaultTableName); //设置缺省的表名
};
//查询语法树
class CSdbms_SyntaxTree
{
public:
CSdbms_SyntaxTree(CSdbms_Table *pTable, CSdbms_SecurityLevel slUser);
CSdbms_SyntaxTree(UINT nExprCount, CSdbms_Express **ppExpr, CSdbms_SyntaxTree *pNext);
CSdbms_SyntaxTree(CSdbms_Condition *pCondition, CSdbms_SyntaxTree *pNext);
CSdbms_SyntaxTree(CSdbms_SyntaxTree *pLeft, CSdbms_SyntaxTree *pRight);
~CSdbms_SyntaxTree();
NodeType m_nNodeType; //结点类型
union
{
struct
{
CSdbms_Table *m_pTable; //叶子结点是表指针
CSdbms_SecurityLevel *m_pSLUser; //当前用户在该表上的当前安全级
}m_leaf;
struct
{
OPAlgebra m_nAlgebra; //关系代数运算操作
union
{
struct //用于投影操作
{
int m_nExprCount; //表达式数目
CSdbms_Express **m_ppExpr;//表达式数组
CSdbms_SyntaxTree *m_pNext;
};
struct //用于选择操作
{
CSdbms_Condition *m_pCondition;
CSdbms_SyntaxTree *m_pNext;
};
struct //用于联接操作
{
CSdbms_SyntaxTree *m_pLeft;
CSdbms_SyntaxTree *m_pRight;
};
};
}m_interior;
};
BOOL Evaluate(CSdbms_Table **ppTable, CSdbms_SecurityLevel *pSLUser); //计算查询语法树
private:
BOOL Evaluate_Projection(CSdbms_Table **ppTable, CSdbms_SecurityLevel *pSLUser); //计算投影
BOOL Evaluate_Selection(CSdbms_Table **ppTable, CSdbms_SecurityLevel *pSLUser); //计算选择
BOOL Evaluate_Join(CSdbms_Table **ppTable, CSdbms_SecurityLevel *pSLUser); //计算联接
};
//审计设置表
class CSdbms_AuditSetup
{
public:
CSdbms_AuditSetup();
~CSdbms_AuditSetup();
CSdbms_Table *m_pTable; //审计记录表
CUIntArray m_AuditUserArray1; //审计类型1, 按UserID排序
CUIntArray m_AuditRoleArray1; //审计类型1, 按RoleID排序
CTypedPtrList<CPtrList, CSdbms_AuditType2*> m_AuditUserList2; //审计类型2, 按SqlID,TableID,FieldID排序
CTypedPtrList<CPtrList, CSdbms_AuditType2*> m_AuditRoleList2; //审计类型2, 按SqlID,TableID,FieldID排序
CTypedPtrList<CPtrList, CSdbms_AuditType3*> m_AuditUserList3; //审计类型3, 按SqlID排序
CTypedPtrList<CPtrList, CSdbms_AuditType3*> m_AuditRoleList3; //审计类型3, 按SqlID排序
BOOL InsertUser(UINT nUserID);
BOOL InsertUser(ObjectRight nObjectRight, UINT nUserID, UINT nTableID);
BOOL InsertUser(SystemRight nSystemRight, UINT nUserID);
BOOL InsertRole(UINT nRoleID);
BOOL InsertRole(ObjectRight nObjectRight, UINT nRoleID, UINT nTableID);
BOOL InsertRole(SystemRight nSystemRight, UINT nRoleID);
BOOL RemoveUser(UINT nUserID);
BOOL RemoveUser(ObjectRight nObjectRight, UINT nUserID, UINT nTableID);
BOOL RemoveUser(SystemRight nSystemRight, UINT nUserID);
BOOL RemoveRole(UINT nRoleID);
BOOL RemoveRole(ObjectRight nObjectRight, UINT nRoleID, UINT nTableID);
BOOL RemoveRole(SystemRight nSystemRight, UINT nRoleID);
BOOL Audit(CSdbms_User *pUser, SystemRight nSqlID, CSdbms_Database *pDB=NULL);
BOOL Audit(CSdbms_User *pUser, ObjectRight nSqlID, CSdbms_Table *pTable, CSdbms_Database *pDB);
BOOL SetOperateSuccess(); //把上一次插入的审计记录中的"操作成功"属性值改为TRUE
BOOL NeedAudit(CSdbms_User *pUser, SystemRight nSqlID, CSdbms_Database *pDB=NULL); //是否需要审计
BOOL NeedAudit(CSdbms_User *pUser, ObjectRight nSqlID, UINT nTableID, CSdbms_Database *pDB); //是否需要审计
void Release(); //删除所有审计记录及审计设置
private:
UINT m_nMaxAuditID; //最大审计记录的编号
BOOL m_bLastAuditSuccess; //上一次审计是否成功
BOOL CheckRoleAudit(CSdbms_User *pUser, SystemRight nSqlID, CSdbms_Database *pDB); //是否需要审计
BOOL CheckRoleAudit(CSdbms_User *pUser, ObjectRight nSqlID, UINT nTableID, CSdbms_Database *pDB); //是否需要审计
BOOL RoleNeedAudit(UINT nRoleID, SystemRight nSqlID); //角色是否需要审计
BOOL RoleNeedAudit(UINT nRoleID, ObjectRight nSqlID, UINT nTableID); //角色是否需要审计
};
//审计类型1---------该类没用到
class CSdbms_AuditType1
{
public:
CSdbms_AuditType1(){}
~CSdbms_AuditType1(){}
UINT m_nID;
};
//审计类型2
class CSdbms_AuditType2
{
public:
CSdbms_AuditType2(){}
~CSdbms_AuditType2(){}
ObjectRight m_nSqlID; //增删改查四种操作的编码
/****应该增加数据库ID一项,有待改进!****/
UINT m_nTableID;
CUIntArray m_IDArray; //用户ID或角色ID
};
//审计类型3
class CSdbms_AuditType3
{
public:
CSdbms_AuditType3(){}
~CSdbms_AuditType3(){}
SystemRight m_nSqlID;
CUIntArray m_IDArray; //用户ID或角色ID
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -