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

📄 sdbms_datastruct.h

📁 使用yacc的一个例子
💻 H
📖 第 1 页 / 共 2 页
字号:
#ifndef _SDBMS_DATASTRUCT_H
#define _SDBMS_DATASTRUCT_H

#include <afxtempl.h>
#include "Sdbms_GlobalDefines.h"

struct CSdbms_Cols;
struct CSdbms_Values;		
struct CSdbms_OrderList;
class CSdbms_SecurityLevel;
class CSdbms_Table;
class CSdbms_Field;
class CSdbms_RecordBlock;
class CSdbms_User;
class CSdbms_Role;
class CSdbms_RoleUser;
class CSdbms_RoleSystemRight;
class CSdbms_RoleObjectRight;
class CSdbms_UserTable;
class CSdbms_Express;
class CSdbms_Condition;
class CSdbms_SyntaxTree;
class CSdbms_AuditSetup;
class CAuditTable;
class CSdbms_AuditType1;
class CSdbms_AuditType2;
class CSdbms_AuditType3;

//数据库
class CSdbms_Database
{
public:
	CSdbms_Database();
	CSdbms_Database(CString strDBName, UINT nDBID, CString strFilePath, CSdbms_User *pCreatorUser);
	~CSdbms_Database();

	CString	m_strDBName;		//数据库名
	UINT	m_nDBID;			//数据库内码
	CString	m_strFilePath;		//数据库文件名路径
	CSdbms_Role	*m_pCreatorRole;	//这个角色的用户是数据库的创建者
	CSdbms_Role	*m_pRole;			//定义在数据库上的自定义角色的链表的首结点指针
	CTypedPtrArray<CPtrArray, CSdbms_Table*>	m_TableArray;		//数据库中包含的表数组,按表ID从小到大排序
	CTypedPtrList<CPtrList, CSdbms_UserTable*>	m_UserTableList;	//用户在各个表上的信息,按用户ID、表ID排序
//	CTypedPtrArray<CPtrArray, CSdbms_Role*>	m_TBCreatorRoleArray;	//每个表的创建者角色的数组,与表数组一一对应
	CTypedPtrList<CPtrList, CSdbms_RoleUser*>	m_RoleUserList;	//按角色排序的角色用户关系表
	CTypedPtrList<CPtrList, CSdbms_RoleUser*>	m_UserRoleList;	//按用户排序的角色用户关系表
	BOOL	m_bInit;			//是否进行了初始化

private:
	UINT	m_nCreatorID;		//数据库创建者的ID
	UINT	m_nMaxRoleID;		//最大的角色内码
	UINT	m_nMaxTableID;		//最大的表内码

public:
	BOOL Init(){return true;}	//初始化数据库
	BOOL Close();				//关闭数据库

	UINT GetCreatorID(){ return m_nCreatorID; }
	BOOL IsOwnLoginRole(CSdbms_User *pUser);		//用户是否属于LOGIN角色(即是否可登录到该数据库上)
	BOOL IsDBCreator(UINT nUserID);			//用户是否是DB的创建者
	BOOL IsTableCreator(UINT nUserID, CString strTableName);	//用户是否是表的创建者
	BOOL IsTableGuest(CSdbms_User *pUser, CSdbms_Table *pTable);//用户是否是表上的客户
	BOOL HaveSystemRight(CSdbms_User *pUser, SystemRight nSqlID);	//用户在这个数据库上是否具有某些系统权限
	BOOL FindObjectRight(CSdbms_User *pUser, CSdbms_Table *pTable, CSdbms_Field *pField, ObjectRight nObjectRight);//用户在某个表的某个列上是否具有操作权限
	BOOL HaveObjectRight(CSdbms_User *pUser, CSdbms_Table *pTable, CSdbms_Field *pField, ObjectRight nObjectRight, BYTE *pRecord);//用户在某个表的某个列上是否具有操作权限

	BOOL DeleteUser(CSdbms_User *pUser);						//从LOGIN角色中删掉用户,及删除相关信息
	BOOL CreateRole(CString strRoleName);				//创建新的角色
	BOOL DropRole(CString strRoleName);					//删除角色
	BOOL SetParentRole(CString strParentRoleName, CString strChildRoleName);	//设置父角色
	BOOL SetChildRole(CString strParentRoleName, CString strChildRoleName);		//设置子角色
	BOOL SetTopRole(CString strRoleName);				//设置角色为顶层角色
	BOOL AddUserToRole(CSdbms_User *pUser, CString strRoleName);				//把用户加到角色中
	BOOL DelUserFromRole(CSdbms_User *pUser, CString strRoelName);			//从用户中删除角色
	BOOL DelAllRole(CSdbms_User *pUser);										//删除用户属于的所有角色

	BOOL Grant(SystemRight nSystemRight, CString strRoleName, UINT nGrantUserID);	//给角色授权系统权限
	BOOL Revoke(SystemRight nSystemRight, CString strRoleName, UINT nGrantUserID);	//给角色取消系统权限授权
	BOOL Grant(CSdbms_User *pUser, ObjectRight nObjectRight, CString strTableName, //给角色授予对象权限
			CString strFieldName, CString strRoleName,BOOL bCanGrant=FALSE, CSdbms_Condition *pCondition=NULL);
	BOOL Revoke(CSdbms_User *pUser, ObjectRight nObjectRight, CString strTableName, //取消角色的对象权限授权
			CString strFieldName, CString strRoleName,BOOL bRevokeGrant=FALSE, 
			BOOL bRestrict=FALSE, CSdbms_Condition *pCondition=NULL);

	BOOL SetAllowSecurityLevel(CSdbms_User *pUser, CString strTableName, CSdbms_SecurityLevel slAllow);	//设置用户在表上的允许安全级
	BOOL SetCurrentSecurityLevel(CSdbms_User *pUser, CString strTableName, CSdbms_SecurityLevel slCurrent);	//设置用户在表上的当前安全级
	BOOL SetTableSecurityLevel(CString strTableName, CSdbms_SecurityLevel slTable);	//设置表安全级

	BOOL CreateTable(CString strTableName, UINT nCSdbms_ColsCount, CSdbms_Cols *pCSdbms_Cols, CSdbms_SecurityLevel *pSecLevel);//创建表
	BOOL DropTable(CString strTableName);	//删除表
	BOOL Insert(CString strTableName, UINT nFieldCount, CString *strFieldName, UINT nValuesCount, CSdbms_Values *pValues);//INSERT
	BOOL Update(CString strTableName, UINT nFieldCount, CString *strFieldName, UINT nValuesCount, CSdbms_Values *pValues, CSdbms_Condition *pCondition=NULL);//UPDATE
	BOOL Delete(CString strTableName, CSdbms_Condition *pCondition=NULL);	//DELETE操作
	BOOL Select(UINT nExprCount, CSdbms_Express **ppExpr, UINT nTableCount, CString *strTableName, CSdbms_Condition *pCondition, UINT nOrderCount, CSdbms_OrderList *pOrder, CSdbms_SecurityLevel *pSecLevel);

	BOOL Audit(CString strRoleName);
	BOOL Audit(ObjectRight nSqlID, UINT nUserID, CString strTableName);
	BOOL Audit(ObjectRight nSqlID, CString strRoleName, CString strTableName);
	BOOL Audit(SystemRight nSqlID, CString strRoleName);
	BOOL Noaudit(CString strRoleName);
	BOOL Noaudit(ObjectRight nSqlID, UINT nUserID, CString strTableName);
	BOOL Noaudit(ObjectRight nSqlID, CString strRoleName, CString strTableName);
	BOOL Noaudit(SystemRight nSqlID, CString strRoleName);

	//Helper Functions
	BOOL GetRole(CString strRoleName, CSdbms_Role **ppRole);	//根据角色名找到自定义角色的指针
	BOOL GetRole(UINT nRoleID, CSdbms_Role **ppRole);			//根据角色内码找到自定义角色的指针
	BOOL GetTable(CString strTableName, CSdbms_Table **ppTable);	//根据关系名找到数据库中的表指针
	BOOL GetTable(UINT nTableID, CSdbms_Table **ppTable);	//根据关系内码找到数据库中的表指针
	CSdbms_SecurityLevel GetUserCurSecLevel(CSdbms_User *pUser, CSdbms_Table *pTable);//得到用户在某表上的当前安全级
	CSdbms_SecurityLevel GetUserAllowSecLevel(CSdbms_User *pUser, CSdbms_Table *pTable);//得到用户在某表上的允许安全级
//	BOOL GetTBCreatorRole(UINT nTableID, CSdbms_Role **pRole);//找到表的创建者角色

private:
	BOOL ReadDD(void){return TRUE;}			//读DB数据字典,m_bInit=1;
	BOOL SaveDD(void){return TRUE;}			//存储DB数据字典,m_bInit=0;
	BOOL InsertRoleUserList(CSdbms_RoleUser *pRoleUser);				//插入到角色用户关系表中
	BOOL InsertUserRoleList(CSdbms_RoleUser *pRoleUser);				//插入到用户角色关系表中
	CSdbms_RoleUser* RemoveRoleUserList(CSdbms_User *pUser, CSdbms_Role *pRole);	//从角色用户关系表中删除
	CSdbms_RoleUser* RemoveUserRoleList(CSdbms_User *pUser, CSdbms_Role *pRole);	//从用户角色关系表中删除
	BOOL InsertUserTableList(CSdbms_UserTable *pUserTable);			//插入到用户-关系表中
	CSdbms_UserTable* RemoveUserTableList(CSdbms_User *pUser, CSdbms_Table *pTable);	//从用户-关系表中删除
	POSITION FindUserTable(CSdbms_User *pUser, CSdbms_Table *pTable);	//查找用户-关系表结点
	POSITION FindRoleUser(CSdbms_Role *pRole, CSdbms_User *pUser);	//找到角色用户关系
	POSITION FindUserRole(CSdbms_User *pUser, CSdbms_Role *pRole);	//找到用户角色关系
	BOOL AdjustRoleTree(CString strParentRoleName, CString strChildRoleName, //调整角色树,被SetParentRole,SetChildRole调用
					CSdbms_Role **ppParentRole, CSdbms_Role **ppChildRole);
	BOOL AdjustRoleTree(CString strRoleName, CSdbms_Role **ppRole);	//调整角色树,被DropRole调用
	BOOL Revoke(CSdbms_User *pUser);	//收回该用户以任何角色身份授予在该数据库上的所有权限
	BOOL Revoke(CSdbms_Role *pRole);	//收回该角色的所有对象权限及任何用户以该角色身份授予在该数据库上的所有权限
	BOOL Revoke(CSdbms_RoleUser *pRoleUser);	//收回该用户以该角色身份授予在该数据库上的所有权限
	CSdbms_SyntaxTree* GetSyntaxTree(UINT nExprCount, CSdbms_Express **ppExpr, CSdbms_SecurityLevel *pSL, CSdbms_Condition *pCondition, UINT nTableCount, CSdbms_Table **ppTabeList);	//构造查询语法树

public:
	//Temp and Test Functions
	void Output(CString strFileName);
//	void ViewRoleUserList();
//	void ViewUserRoleList();
};

//安全级
class CSdbms_SecurityLevel
{
public:
	CSdbms_SecurityLevel();
	CSdbms_SecurityLevel(int nClass);
	CSdbms_SecurityLevel(const CSdbms_SecurityLevel& seclevel);
	CSdbms_SecurityLevel(BYTE *pData, UINT nSize);
	~CSdbms_SecurityLevel();
 
	int	m_nClassifaction;				//密级
	int	m_nRangeCount;					//非分层范围大小
	int m_nRange[MAX_RANGE];			//非分层范围内码表示,必须是从小到大排,最大只能有MAX_RANGE个
	CString	m_strRange[MAX_RANGE];		//非分层范围字符串表示,最大只能有MAX_RANGE个

	//非分层范围字符串与内码的对应关系在创建表时指定的表安全级决定,在随后的相关安全级
	//运算中必须用内码表示。
	const CSdbms_SecurityLevel& operator=(const CSdbms_SecurityLevel& seclevel);
	bool operator==(const CSdbms_SecurityLevel& seclevel);
	bool operator!=(const CSdbms_SecurityLevel& seclevel);
	bool operator>(const CSdbms_SecurityLevel& seclevel);
	bool operator>=(const CSdbms_SecurityLevel& seclevel);
	bool operator<(const CSdbms_SecurityLevel& seclevel);
	bool operator<=(const CSdbms_SecurityLevel& seclevel);

	UINT GetSize();		//得到安全级长度,即所占字节数
	BYTE* GetValue();	//得到字节形式的安全级数据,包含密级及非分层范围的内码表示
	CString GetFormatString(CSdbms_SecurityLevel* pslBase=NULL);	//得到安全级的字符串形式表示
	BOOL IsRangeItem(CString strItem, UINT *nIndex);	//判断某字符串是否属于非分层范围
	BOOL IsEmpty();		//安全级是否为空
	void Empty();		//设置安全级为空
	void Adjust();		//对安全级内码从小到大进行排序且去除重复项
	void ParseRangeString(CString strRange);	//解析用户输入的用逗号隔开的非分层范围字符串
};

//表
class CSdbms_Table
{
public:
	CSdbms_Table();
	~CSdbms_Table();

	CString	m_strTableName;		//关系名
	UINT	m_nTableID;			//关系内码
	CSdbms_SecurityLevel	m_SecLevel;	//表安全级
	UINT	m_nMaxFieldID;		//最大的属性内码
	UINT	m_nKeyCount;		//主关键字个数
	CTypedPtrArray<CPtrArray, CSdbms_Field*> m_FieldArray;	//关系中的属性数组(属性只增不减)
	CSdbms_Role	*m_pCreatorRole;	//表创建者角色

	UINT	m_nRecordSize;		//记录长度,包括安全级长度
	UINT	m_nTotalRecords;	//总记录数
//	UINT	m_nFirstBlocks;		//读出的第一个记录块的序号
	CTypedPtrList<CPtrList, CSdbms_RecordBlock*>	m_BlockList;	//记录块链表

	//GUEST和OWNER角色作为逻辑上的概念
	UINT	m_nCreatorID;		//表创建者的ID
private:
	POSITION	m_posCurBlock;	//当前读取的记录所在块的位置
	UINT	m_nCurIndexInBlock;	//当前读取的记录在所在块的索引位置
public:
	BOOL Insert(BYTE *pRecord);
	BOOL Insert(CSdbms_SecurityLevel slUser, BYTE *pRecord);
	BOOL Update(CSdbms_SecurityLevel slUser, BYTE *pRecord, CSdbms_Condition *pCondition);
	BOOL Delete(CSdbms_SecurityLevel slUser, CSdbms_Condition *pCondition);

	void DelAllRecords();	//删除所有记录

	BYTE*	GetCurRecord();
	BYTE*	GetFirstRecord();
	BYTE*	GetLastRecord();
	BYTE*	GetPrevRecord();
	BYTE*	GetNextRecord();
	BYTE*	DeleteRecord(BYTE* pRecord);

	BOOL IsTableCreator(UINT nUserID);
	BOOL GetField(CString strFieldName, CSdbms_Field **ppField);	//得到属性列指针
	CSdbms_SecurityLevel GetKeyColSecLevel(BYTE *pRecord);		//得到关键属性的安全级
};

//列
class CSdbms_Field
{
public:
	CSdbms_Field();
	~CSdbms_Field(){}

	CString		m_strFieldName;		//属性名
	UINT		m_nFieldID;			//属性内码
	UINT		m_nLength;			//最大长度
	DataType	m_nDataType;		//属性数据类型
	BOOL		m_bKey;				//关键字标志
	BOOL		m_bForeignKey;		//外关键字标志
	BOOL		m_bIndex;			//索引标志
	BOOL		m_bCanNULL;			//可否为空

	CSdbms_Table*		m_pOwnTable;		//该属性列属于哪个表
};


//记录
class CSdbms_RecordBlock
{
public:
	CSdbms_RecordBlock():m_bUsed(NULL){}
	~CSdbms_RecordBlock()
	{
		if	(m_bUsed)
			delete m_bUsed;
	}

	UINT	m_nRecodCount;		//一块中含有多少个记录
	BOOL	*m_bUsed;			//一个记录是否被用,其长度=2048/记录长度
	BYTE	m_pData[MAX_RECORD_SIZE];	//存放数据
};

//用户
class CSdbms_User
{
public:
	CSdbms_User();
	CSdbms_User(CString strUserName, UINT nUserID, CString strPassword, CSdbms_SecurityLevel sl);
	~CSdbms_User();

	CString	m_strUserName;				//用户名
	UINT	m_nUserID;					//用户内码
	char	m_strPassword[PASSWORD_LENGTH];	//用户口令
	CSdbms_SecurityLevel	m_SecLevel;			//用户最大安全级
//	CTypedPtrList<CPtrList, CSdbms_UserRole*>  m_RolesList;	//用户所属的角色列表

	POSITION	m_pos;	//用户在当前连接的DB上的角色用户关系表(m_UserRoleList)中的索引位置

public:
//	BOOL IsOwnRole(CString strRoleName, CSdbms_Database *pDB);	//用户是否属于数据库中的某个角色
//	BOOL IsOwnRole(UINT nRoleID, CSdbms_Database *pDB);			//用户是否属于数据库中的某个角色
};

/*
//用户-角色表
class CSdbms_UserRole
{
public:
	CSdbms_UserRole();
	~CSdbms_UserRole();

	RoleType	m_nRoleType;	//角色类型(0:全局型,1:数据库级,2:表级)
	UINT		m_nRoleID;		//角色内码
								//若角色类型为全局型, =0或1或2
								//若角色类型为数据库级, =0或大于等于1的自定义角色的内码
								//若角色类型为表级, =0或1
	CSdbms_Role		*m_pRole;		//指向内存中该角色的指针
	UINT		m_nOwnerID;		//若角色类型为全局型, =-1;
								//若角色类型为数据库级, =DB内码
								//若角色类型为表级, =表内码
};
*/

//用户-关系表
class CSdbms_UserTable
{
public:
	CSdbms_UserTable():m_pUser(NULL), m_pTable(NULL){}
	~CSdbms_UserTable(){}

	CSdbms_User	*m_pUser;
	CSdbms_Table	*m_pTable;
	CSdbms_SecurityLevel	m_AllowSecLevel;	//用户在该表上的允许安全级
	CSdbms_SecurityLevel	m_CurSecLevel;		//用户在该表上的当前安全级
};

//角色
class CSdbms_Role
{
public:
	CSdbms_Role();
	CSdbms_Role(CString strRoleName, UINT nRoleID);
	~CSdbms_Role();

	CString			m_strRoleName;		//角色名
	UINT			m_nRoleID;			//角色内码
	CTypedPtrList<CPtrList, CSdbms_RoleSystemRight*>	m_SRList;	//角色-系统权限表,按系统命令内码从小到大排序
	CTypedPtrList<CPtrList, CSdbms_RoleObjectRight*>	m_ORList;	//角色-对象权限表,按表、列内码及sql编码排序

	CSdbms_Role	*m_pParentRole;			//父角色(每个角色只能有一个父角色,但可以有多个子角色)
	CSdbms_Role	*m_pNextBrotherRole;	//下一个兄弟角色
//	UINT	m_nTotleChilds;			//子角色个数

⌨️ 快捷键说明

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