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

📄 sdbms_datastruct.h

📁 使用yacc的一个例子
💻 H
📖 第 1 页 / 共 2 页
字号:
	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 + -