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

📄 intepretor.h

📁 设计并实现一个精简型单用户SQL引擎(DBMS)MiniSQL
💻 H
字号:
#ifndef INTEPRETOR_HPP
#define INTEPRETOR_HPP
#define INPUTMAX 256
#define NAMEMAXLEN 32
#define ECMD_TYPE enum MSG
#define ECOL_TYPE enum Column_Type 
#define EOPE_TYPE enum Operator_Type
#define COLVAL Column_Value
#define Conds TSelect_Condition
#define Delete_Condition TSelect_Condition
#define pDel_Cond pSel_Cond
#define Del_Cond TSelect_Condition
#define pConds pSel_Cond
#define Sel_Col TSelect_Column
#define Ins_Col TInsert_Column
#define Upd_Col TUpdate_Column 
#define isprimary IsPrimary
#include "Display.h"
#include "Glob_Var.h"
#include <iostream>
enum ErrType {RESOLVE,COMMON,COLUMNTYPE,KEYWORD,COLNAMEERR_IN_CHECK,GET_OP_ERR,NOCOL};
enum GnlErrType{NOSUCHDB,NOSUCHTB,NODBUSED,SUCHDBEXIST,SUCHTBEXIST,WITHOUTMATCH,NOPRIMARYKEY};
 

 
typedef struct TVSTR_BLK* VSTR_BLK_PTR;
 typedef struct TVSTR_BLK
 {
 char* str;                                                    //有意字串,有意字串的定义见文档
 VSTR_BLK_PTR  next;                                           //指向下一个有意字串的VSTR_BLK指针
 ~TVSTR_BLK(){delete str;delete next;}
 }VSTR_BLK;

 //类型说明:表示错误类型和错误编码的结构体信息
 //    字符串输入错误,需要给出可能的错误输入字串和其所在的行号
 typedef struct ErrInfo
 {
 int iErrType;                                                  //错误类型号
 int iLineNo;                                                   //错误所在的行号
 char* pErrStr;                                                 //错误可能出现的有意字串
 ErrInfo(){};
 ErrInfo(const ErrInfo& src)
 {this->iErrType = src.iErrType;
 this->iLineNo = src.iLineNo;
 int i = strlen(src.pErrStr);
 this->pErrStr = new char[i+1];
 strcpy(this->pErrStr,src.pErrStr);}
 ~ErrInfo()
 {delete [] pErrStr;                                            //由于pErrStr接收的是new出来的字串
 }
 }TErrInfo;

 //类型说明:表示一般性错误类型的结构体信息
 //    一般性错误,所谓一般性错误,是指无需指明行号的错误,如在没有指定数据库之前就使用表
  typedef struct GnlErrInfo
 {
 int iErrType;                                                  
 }TGnlErrInfo;


 // 类型说明:表示Create命令中一列信息的结构体
 typedef  struct  Create_Column* pCreate_Column; 
 typedef  struct  Create_Column 
 {
 char ColumnName[NAMEMAXLEN];                                   //字段名(规定最长为32位)
 ECOL_TYPE	            ColType;                                //字段类型,如int,float,char
 int	                length;	                                //字段类型长度,如char(8)
 COLVAL                 min;                                    //下限,如例中的00000000
 COLVAL		            max;                                    //上限,如例中的12345678
 EOPE_TYPE	            OperType;                               //关系运算符类型,如<, >=, =等等
 bool               	IsNull;                                 //isnull=0,则此字段有not null的限制
 bool	                IsPrimary;                              //isprimary=1, 则此字段是primary key
 pCreate_Column	        next;

 Create_Column(char* str,ECOL_TYPE coltype,int strlen,bool not_null,bool ispri);
 //初始化函数,尤其注意对min和max的初始化,默认min>max
 ~Create_Column(){delete next;};
 void SetColValstr(EOPE_TYPE optype,char* chMin,char* chMax);
 //将Create_Column()里未根据实际初始的min.pCharValue,max.pCharValue初始一下,并设定好长度
 void SetColValint(EOPE_TYPE optype,int iMin,int iMax);
 //将Create_Column()里未根据实际初始的min.IntValue,max.IntValue初始一下
 void SetColValfloat(EOPE_TYPE optype,float fMin,float fMax);
 //将Create_Column()里未根据实际初始的min.FloatValue,max.FloatValue初始一下
 void SetColVal(EOPE_TYPE optype,COLVAL &tMin ,COLVAL &tMax);
 //根据tMin和tMax来设置min和max
 }TCreate_Column;


 
 //表述一个Create命令的所有参数的参数类
 class TB_Create_Info 
 {
  public:
  int		        TotalColumn;                                //字段总数
  pCreate_Column	head;			                            //字段链表头
  char		        TableName[32];		                        //表名(规定最长为32位)
  TB_Create_Info(int,pCreate_Column,char*);  
  //初始化函数,将所有的列信息整合成一张表
  ~TB_Create_Info(){delete head;}
 };


 typedef struct TSelect_Column *pSel_Col;
 typedef struct TSelect_Column 
{													            //选择的字段
	char 				ColumnName[NAMEMAXLEN];				    //字段名(限定最长32位)
	TSelect_Column*		next;						            //下一个字段
	TSelect_Column(char* strColName){next=NULL;strcpy(ColumnName,strColName);}
	~TSelect_Column(){delete next;}
}Select_Column;


typedef struct TSelect_Condition *pSel_Cond;
typedef  struct TSelect_Condition 
{			//选择条件(where…)
	char				    PrimaryKey[NAMEMAXLEN];     		//主键名	
	COLVAL		            max;					            //上限
	COLVAL		            min;		              			//下限  
	Column_Type			    ColType;                            //属性的类型    
	Operator_Type		    OperType;	            			//关系运算符
	TSelect_Condition*	next;						            //下一个选择条件
	TSelect_Condition(){next=0;}

	~TSelect_Condition(){delete next;}
    TSelect_Condition(char* str,COLVAL tMin,COLVAL tMax,Column_Type tcoltype,Operator_Type toptype){
	strcpy(PrimaryKey,str);                                     //拷贝条件中的主键的名字
	max = tMax;             
	min = tMin;                                                 //赋条件值
	ColType = tcoltype;                                         //属性类型
	OperType = toptype;                                         //操作类型
	next = 0;}
}Select_Condition;

class TB_Select_Info
{
public:
	TSelect_Column*	  	        ColumnHead;					    //选择的字段链表
	TSelect_Condition*	        ConditionHead;				    //选择的条件链表
	int	        				ColumnNum;				        //所要选择的字段个数
	int		        			ConditionNum;		          	//条件链表的长度
	char				        TableName[NAMEMAXLEN];			//表名
  //初始化Select的各个私有成员
	TB_Select_Info(char* strTBname,int i,TSelect_Column* pColHead,int j,pSel_Cond pCondHead)
	{
		ColumnHead = pColHead;    
		ConditionHead = pCondHead;
		ColumnNum = i;
		ConditionNum = j;
		strcpy(TableName,strTBname);
	}
	TB_Select_Info(){
		ColumnHead = NULL;
		ConditionHead = NULL;
		ColumnNum = 0;
		ConditionNum = 0;
		strcpy(TableName,"");
	}
  ~TB_Select_Info(){delete ColumnHead;delete ConditionHead;}
};
    
//插入的记录的其中一个字段信息
typedef struct TInsert_Column *pIns_Col;
typedef  struct TInsert_Column  
{											    
	char		      		ColumnName[NAMEMAXLEN];			    //字段名
	Column_Type		  	    ColType;		              		//此字段的类型
	COLVAL		            value;
	TInsert_Column*		    next;			                	//下一个字段信息
	TInsert_Column(char* str,Column_Type coltype,COLVAL val):
        ColType(coltype),value(val) {strcpy(ColumnName,str);
	next = NULL;}
	~TInsert_Column(){delete next;}
}Insert_Column;

//插入的记录
class TB_Insert_Info							
{
public:
	TB_Insert_Info(char* tbname,pIns_Col phead,int ival):head(phead),ColumnNum(ival){strcpy(TableName,tbname);}
	char 			        TableName[NAMEMAXLEN];				//所要插入的表名
	Insert_Column*      	head;				               	//所有字段信息链表
	int			           	ColumnNum;		          			//链表长度
	~TB_Insert_Info(){delete head;} 
};

										    
//修改的记录的其中一个字段信息
typedef struct TUpdate_Column *pUpd_Col;
typedef struct TUpdate_Column 
{
	char				    ColumnName[NAMEMAXLEN];		        //字段名
	Column_Type		    	ColType;	            		    //此字段的类型
	COLVAL		            value;                              //字段的新值
	TUpdate_Column*		    next;	              			    //下一个字段信息
	TUpdate_Column(char* colname,Column_Type tcoltype,COLVAL val):
	ColType(tcoltype),value(val),next(0)
	{strcpy(ColumnName,colname);
	}
	~TUpdate_Column(){delete next;}
}Update_Column;


//修改信息
class	 TB_Update_Info						
{
public:
	TB_Update_Info(char* tbname,Update_Column* colhead,int colnum,pConds condhead,int condnum):
	ColumnHead(colhead),ConditionHead(condhead),ColumnNum(colnum),ConditionNum(condnum)
	{strcpy(TableName,tbname);}
	Update_Column*		ColumnHead;		      	                //所要修改的字段及其值的链表
	pConds 	            ConditionHead;	    	                //修改的范围的查询条件链表
	int					ColumnNum;			                    //字段数
	int					ConditionNum;		                    //条件数
	char				TableName[NAMEMAXLEN];		            //要执行修改的表名
	~TB_Update_Info(){delete ColumnHead;delete ConditionHead;}
};


//删除信息
class	 TB_Delete_Info						
{
public:
	char		      		TableName[32];		                //要进行删除的表名
	Delete_Condition*	    head;			    	            //条件链表
	int					    ConditionNum;	  	                //条件链表长度
	TB_Delete_Info(char* tbn,Delete_Condition *pdel_cond,int icond):
	head(pdel_cond),ConditionNum(icond)
	{
		strcpy(TableName,tbn);
	}
	~TB_Delete_Info(){delete head;};
};

 //处理输入的一个类,包括输入->有意字串,有意字串->参数类的组织全在其成员函数之中
 class Ch_csVstrBlk
 {
  public:
    Ch_csVstrBlk();                                             
    //对输入进行处理,产生一个有以字串的集合
  	~Ch_csVstrBlk(){delete strInputCharList;delete  StrHead;}

    void MakeVstrBlkList();
    //用于将所有vstrBlk给打印出来
    TB_Create_Info* CH_Create();
    //负责Create命令的所有操作
    TB_Select_Info* CH_Select();
    //负责Select命令的所有操作 
    TB_Insert_Info* CH_Insert();
    //负责Insert命令的所有操作 
    TB_Update_Info* CH_Update();
    //负责Update命令的所有操作 
    TB_Delete_Info* CH_Delete();
    //负责Deletc命令的所有操作
	  
    ECMD_TYPE ResolveCmd();
    //负责判断第一个有意字串并决定输入的到底是何命令
	void ThrowStrErr(int type,int iNum = 0);
    //负责构造一个错误类并将它抛出来
    void PassCommon(char*);
    void ChoseDatabase();
    //选择一个数据库
    void DropDB();
    //删除一个数据库
    void DropTB();
   //删除一个表
    void NewDB();
   //创建一个数据库

  private:
    VSTR_BLK_PTR StrHead;
    VSTR_BLK_PTR StrNow;
    VSTR_BLK_PTR StrTail;
    char* strInputCharList;
    int iNumNowInVstr;
    //记录现在StrNow所指的对象在链表中所处的序号(从1开始计数)
    int iLineNum[20][2];                                        
    //记录输入的行数信息,用于出错时提示,
    
    int sta_i;
    //用于描述对于这一次的命令输入的处理中当前所出的在strInputCharList中的位置,见InString();函数

	char* InitialInput();
    //初始化输入
    char* GetTBName();
    //从StrNow->str中得到所需要的表名
    bool InString(char**);
    //在初始化得到的字符串中获取一个有意字串
    void InitialVar();
    //初始化一些特殊的值
    void NextStr();
    //跳到下一个有意字串
    pCreate_Column GetColumnInfo(bool* NotEnd,bool&);
    void GetCheckInfo(bool *NotEnd,pCreate_Column pHead);
    //得到有关一个列的约束信息
    EOPE_TYPE GetOptype();
    //得到一个列的约束的操作类型
    pCreate_Column GetColForCheck(char* str,pCreate_Column pHead);
    //得到有关一个列的约束类型,是 enum Operator_Type {B, BE, L, LE, E, NE,BETWEEN} 中的一种 
    void SetMin_Max(COLVAL& min,COLVAL& max,EOPE_TYPE optype,ECOL_TYPE coltype,bool next = 1);
    //根据optype给min和max赋值,当前StrNow必须处在处理的有意字串上
    void SetMin_Max(COLVAL temp,COLVAL& min,COLVAL& max,EOPE_TYPE optype,ECOL_TYPE coltype);
    //重载SetMin_Max,利用temp的值配合optype和coltype来给min和max赋值
    void SetColValFStr(ECOL_TYPE& coltype,COLVAL& tColval,bool next = 1);
    //得到有关一个输入的字串为和类型(I,C,F)及对相应的tColVal赋值
    pSel_Col   GetSelColList(int& iColNum);
    //** 功能描述:得到select中关于字段(列名)的列表
    pSel_Cond  GetCondList(int& iCondNum);
    //得到select,update,delete,insert中有关条件的描述信息的列表
    pIns_Col GetInsValList(int& iValNum);
    //得到一个有关Insert函数中所有的输入的值得链表
    pUpd_Col GetUpdColList(int &iColNum);
    //得到Update中关于字段(列名)及其值的列表
 };

 ECMD_TYPE GetCommand(TB_Create_Info**,TB_Select_Info**,TB_Insert_Info**,TB_Update_Info**,TB_Delete_Info**);
 //该模块的主函数,负责所有操作
 char ChUpToLowCase(char);
 //将一个大写字母换成小写,否则原样返回
 char* FilterQuota(char* strin);
 //负责将一个字符串中的单引号过滤,如FilterQuota("'abc'") == "abc"
 bool CompStrEver(char* str1,char* str2);
 //比较两个字符串是否相等,忽略大小写,return 1--相同,0---不同
 void SaveKeyChar(char* str,int* index,char In);
 //保存关键的由于辨别有意字串的关键字符,如回车,在InitialInput()中调用
 void SetCurLocation(char* str);
 //将当前的路径设置好
 void SetCurRelation(char* str);
 //将当前的表名设置好
 void ShowHelp();
 //显示帮助信息
 void QuitSQL();
 //退出MiniSQL
 void ShowMsg();
 //在屏幕上打印消息
 void GnlTrwErr(int);
 //Generally Throw the Errors,一般性错误,如db不存在

 void ResetDBinfo();
 //删除当前正在使用的数据库后对有关数据库路径和名称信息的重新设置

  
#endif// INTEPRETOR_HPP

⌨️ 快捷键说明

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