Intepretor.h
上传用户:lkd6667
上传日期:2015-05-13
资源大小:1448k
文件大小:13k
源码类别:

其他数据库

开发平台:

C/C++

  1. #ifndef INTEPRETOR_HPP
  2. #define INTEPRETOR_HPP
  3. #define INPUTMAX 256
  4. #define NAMEMAXLEN 32
  5. #define ECMD_TYPE enum MSG
  6. #define ECOL_TYPE enum Column_Type 
  7. #define EOPE_TYPE enum Operator_Type
  8. #define COLVAL Column_Value
  9. #define Conds TSelect_Condition
  10. #define Delete_Condition TSelect_Condition
  11. #define pDel_Cond pSel_Cond
  12. #define Del_Cond TSelect_Condition
  13. #define pConds pSel_Cond
  14. #define Sel_Col TSelect_Column
  15. #define Ins_Col TInsert_Column
  16. #define Upd_Col TUpdate_Column 
  17. #define isprimary IsPrimary
  18. #include "Display.h"
  19. #include "Glob_Var.h"
  20. #include <iostream>
  21. enum ErrType {RESOLVE,COMMON,COLUMNTYPE,KEYWORD,COLNAMEERR_IN_CHECK,GET_OP_ERR,NOCOL};
  22. enum GnlErrType{NOSUCHDB,NOSUCHTB,NODBUSED,SUCHDBEXIST,SUCHTBEXIST,WITHOUTMATCH,NOPRIMARYKEY};
  23.  
  24.  
  25. typedef struct TVSTR_BLK* VSTR_BLK_PTR;
  26.  typedef struct TVSTR_BLK
  27.  {
  28.  char* str;                                                    //有意字串,有意字串的定义见文档
  29.  VSTR_BLK_PTR  next;                                           //指向下一个有意字串的VSTR_BLK指针
  30.  ~TVSTR_BLK(){delete str;delete next;}
  31.  }VSTR_BLK;
  32.  //类型说明:表示错误类型和错误编码的结构体信息
  33.  //    字符串输入错误,需要给出可能的错误输入字串和其所在的行号
  34.  typedef struct ErrInfo
  35.  {
  36.  int iErrType;                                                  //错误类型号
  37.  int iLineNo;                                                   //错误所在的行号
  38.  char* pErrStr;                                                 //错误可能出现的有意字串
  39.  ErrInfo(){};
  40.  ErrInfo(const ErrInfo& src)
  41.  {this->iErrType = src.iErrType;
  42.  this->iLineNo = src.iLineNo;
  43.  int i = strlen(src.pErrStr);
  44.  this->pErrStr = new char[i+1];
  45.  strcpy(this->pErrStr,src.pErrStr);}
  46.  ~ErrInfo()
  47.  {delete [] pErrStr;                                            //由于pErrStr接收的是new出来的字串
  48.  }
  49.  }TErrInfo;
  50.  //类型说明:表示一般性错误类型的结构体信息
  51.  //    一般性错误,所谓一般性错误,是指无需指明行号的错误,如在没有指定数据库之前就使用表
  52.   typedef struct GnlErrInfo
  53.  {
  54.  int iErrType;                                                  
  55.  }TGnlErrInfo;
  56.  // 类型说明:表示Create命令中一列信息的结构体
  57.  typedef  struct  Create_Column* pCreate_Column; 
  58.  typedef  struct  Create_Column 
  59.  {
  60.  char ColumnName[NAMEMAXLEN];                                   //字段名(规定最长为32位)
  61.  ECOL_TYPE             ColType;                                //字段类型,如int,float,char
  62.  int                 length;                                 //字段类型长度,如char(8)
  63.  COLVAL                 min;                                    //下限,如例中的00000000
  64.  COLVAL             max;                                    //上限,如例中的12345678
  65.  EOPE_TYPE             OperType;                               //关系运算符类型,如<, >=, =等等
  66.  bool                IsNull;                                 //isnull=0,则此字段有not null的限制
  67.  bool                 IsPrimary;                              //isprimary=1, 则此字段是primary key
  68.  pCreate_Column         next;
  69.  Create_Column(char* str,ECOL_TYPE coltype,int strlen,bool not_null,bool ispri);
  70.  //初始化函数,尤其注意对min和max的初始化,默认min>max
  71.  ~Create_Column(){delete next;};
  72.  void SetColValstr(EOPE_TYPE optype,char* chMin,char* chMax);
  73.  //将Create_Column()里未根据实际初始的min.pCharValue,max.pCharValue初始一下,并设定好长度
  74.  void SetColValint(EOPE_TYPE optype,int iMin,int iMax);
  75.  //将Create_Column()里未根据实际初始的min.IntValue,max.IntValue初始一下
  76.  void SetColValfloat(EOPE_TYPE optype,float fMin,float fMax);
  77.  //将Create_Column()里未根据实际初始的min.FloatValue,max.FloatValue初始一下
  78.  void SetColVal(EOPE_TYPE optype,COLVAL &tMin ,COLVAL &tMax);
  79.  //根据tMin和tMax来设置min和max
  80.  }TCreate_Column;
  81.  
  82.  //表述一个Create命令的所有参数的参数类
  83.  class TB_Create_Info 
  84.  {
  85.   public:
  86.   int         TotalColumn;                                //字段总数
  87.   pCreate_Column head;                             //字段链表头
  88.   char         TableName[32];                         //表名(规定最长为32位)
  89.   TB_Create_Info(int,pCreate_Column,char*);  
  90.   //初始化函数,将所有的列信息整合成一张表
  91.   ~TB_Create_Info(){delete head;}
  92.  };
  93.  typedef struct TSelect_Column *pSel_Col;
  94.  typedef struct TSelect_Column 
  95. {             //选择的字段
  96. char  ColumnName[NAMEMAXLEN];     //字段名(限定最长32位)
  97. TSelect_Column* next;             //下一个字段
  98. TSelect_Column(char* strColName){next=NULL;strcpy(ColumnName,strColName);}
  99. ~TSelect_Column(){delete next;}
  100. }Select_Column;
  101. typedef struct TSelect_Condition *pSel_Cond;
  102. typedef  struct TSelect_Condition 
  103. { //选择条件(where…)
  104. char     PrimaryKey[NAMEMAXLEN];      //主键名
  105. COLVAL             max;             //上限
  106. COLVAL             min;                //下限  
  107. Column_Type     ColType;                            //属性的类型    
  108. Operator_Type     OperType;              //关系运算符
  109. TSelect_Condition* next;             //下一个选择条件
  110. TSelect_Condition(){next=0;}
  111. ~TSelect_Condition(){delete next;}
  112.     TSelect_Condition(char* str,COLVAL tMin,COLVAL tMax,Column_Type tcoltype,Operator_Type toptype){
  113. strcpy(PrimaryKey,str);                                     //拷贝条件中的主键的名字
  114. max = tMax;             
  115. min = tMin;                                                 //赋条件值
  116. ColType = tcoltype;                                         //属性类型
  117. OperType = toptype;                                         //操作类型
  118. next = 0;}
  119. }Select_Condition;
  120. class TB_Select_Info
  121. {
  122. public:
  123. TSelect_Column*            ColumnHead;     //选择的字段链表
  124. TSelect_Condition*         ConditionHead;     //选择的条件链表
  125. int          ColumnNum;         //所要选择的字段个数
  126. int          ConditionNum;            //条件链表的长度
  127. char         TableName[NAMEMAXLEN]; //表名
  128.   //初始化Select的各个私有成员
  129. TB_Select_Info(char* strTBname,int i,TSelect_Column* pColHead,int j,pSel_Cond pCondHead)
  130. {
  131. ColumnHead = pColHead;    
  132. ConditionHead = pCondHead;
  133. ColumnNum = i;
  134. ConditionNum = j;
  135. strcpy(TableName,strTBname);
  136. }
  137. TB_Select_Info(){
  138. ColumnHead = NULL;
  139. ConditionHead = NULL;
  140. ColumnNum = 0;
  141. ConditionNum = 0;
  142. strcpy(TableName,"");
  143. }
  144.   ~TB_Select_Info(){delete ColumnHead;delete ConditionHead;}
  145. };
  146.     
  147. //插入的记录的其中一个字段信息
  148. typedef struct TInsert_Column *pIns_Col;
  149. typedef  struct TInsert_Column  
  150. {     
  151. char        ColumnName[NAMEMAXLEN];     //字段名
  152. Column_Type        ColType;                //此字段的类型
  153. COLVAL             value;
  154. TInsert_Column*     next;                  //下一个字段信息
  155. TInsert_Column(char* str,Column_Type coltype,COLVAL val):
  156.         ColType(coltype),value(val) {strcpy(ColumnName,str);
  157. next = NULL;}
  158. ~TInsert_Column(){delete next;}
  159. }Insert_Column;
  160. //插入的记录
  161. class TB_Insert_Info
  162. {
  163. public:
  164. TB_Insert_Info(char* tbname,pIns_Col phead,int ival):head(phead),ColumnNum(ival){strcpy(TableName,tbname);}
  165. char          TableName[NAMEMAXLEN]; //所要插入的表名
  166. Insert_Column*       head;                 //所有字段信息链表
  167. int             ColumnNum;            //链表长度
  168. ~TB_Insert_Info(){delete head;} 
  169. };
  170.     
  171. //修改的记录的其中一个字段信息
  172. typedef struct TUpdate_Column *pUpd_Col;
  173. typedef struct TUpdate_Column 
  174. {
  175. char     ColumnName[NAMEMAXLEN];         //字段名
  176. Column_Type      ColType;                  //此字段的类型
  177. COLVAL             value;                              //字段的新值
  178. TUpdate_Column*     next;                    //下一个字段信息
  179. TUpdate_Column(char* colname,Column_Type tcoltype,COLVAL val):
  180. ColType(tcoltype),value(val),next(0)
  181. {strcpy(ColumnName,colname);
  182. }
  183. ~TUpdate_Column(){delete next;}
  184. }Update_Column;
  185. //修改信息
  186. class  TB_Update_Info
  187. {
  188. public:
  189. TB_Update_Info(char* tbname,Update_Column* colhead,int colnum,pConds condhead,int condnum):
  190. ColumnHead(colhead),ConditionHead(condhead),ColumnNum(colnum),ConditionNum(condnum)
  191. {strcpy(TableName,tbname);}
  192. Update_Column* ColumnHead;                        //所要修改的字段及其值的链表
  193. pConds              ConditionHead;                      //修改的范围的查询条件链表
  194. int ColumnNum;                     //字段数
  195. int ConditionNum;                     //条件数
  196. char TableName[NAMEMAXLEN];             //要执行修改的表名
  197. ~TB_Update_Info(){delete ColumnHead;delete ConditionHead;}
  198. };
  199. //删除信息
  200. class  TB_Delete_Info
  201. {
  202. public:
  203. char        TableName[32];                 //要进行删除的表名
  204. Delete_Condition*     head;                  //条件链表
  205. int     ConditionNum;                    //条件链表长度
  206. TB_Delete_Info(char* tbn,Delete_Condition *pdel_cond,int icond):
  207. head(pdel_cond),ConditionNum(icond)
  208. {
  209. strcpy(TableName,tbn);
  210. }
  211. ~TB_Delete_Info(){delete head;};
  212. };
  213.  //处理输入的一个类,包括输入->有意字串,有意字串->参数类的组织全在其成员函数之中
  214.  class Ch_csVstrBlk
  215.  {
  216.   public:
  217.     Ch_csVstrBlk();                                             
  218.     //对输入进行处理,产生一个有以字串的集合
  219.    ~Ch_csVstrBlk(){delete strInputCharList;delete  StrHead;}
  220.     void MakeVstrBlkList();
  221.     //用于将所有vstrBlk给打印出来
  222.     TB_Create_Info* CH_Create();
  223.     //负责Create命令的所有操作
  224.     TB_Select_Info* CH_Select();
  225.     //负责Select命令的所有操作 
  226.     TB_Insert_Info* CH_Insert();
  227.     //负责Insert命令的所有操作 
  228.     TB_Update_Info* CH_Update();
  229.     //负责Update命令的所有操作 
  230.     TB_Delete_Info* CH_Delete();
  231.     //负责Deletc命令的所有操作
  232.   
  233.     ECMD_TYPE ResolveCmd();
  234.     //负责判断第一个有意字串并决定输入的到底是何命令
  235. void ThrowStrErr(int type,int iNum = 0);
  236.     //负责构造一个错误类并将它抛出来
  237.     void PassCommon(char*);
  238.     void ChoseDatabase();
  239.     //选择一个数据库
  240.     void DropDB();
  241.     //删除一个数据库
  242.     void DropTB();
  243.    //删除一个表
  244.     void NewDB();
  245.    //创建一个数据库
  246.   private:
  247.     VSTR_BLK_PTR StrHead;
  248.     VSTR_BLK_PTR StrNow;
  249.     VSTR_BLK_PTR StrTail;
  250.     char* strInputCharList;
  251.     int iNumNowInVstr;
  252.     //记录现在StrNow所指的对象在链表中所处的序号(从1开始计数)
  253.     int iLineNum[20][2];                                        
  254.     //记录输入的行数信息,用于出错时提示,
  255.     
  256.     int sta_i;
  257.     //用于描述对于这一次的命令输入的处理中当前所出的在strInputCharList中的位置,见InString();函数
  258. char* InitialInput();
  259.     //初始化输入
  260.     char* GetTBName();
  261.     //从StrNow->str中得到所需要的表名
  262.     bool InString(char**);
  263.     //在初始化得到的字符串中获取一个有意字串
  264.     void InitialVar();
  265.     //初始化一些特殊的值
  266.     void NextStr();
  267.     //跳到下一个有意字串
  268.     pCreate_Column GetColumnInfo(bool* NotEnd,bool&);
  269.     void GetCheckInfo(bool *NotEnd,pCreate_Column pHead);
  270.     //得到有关一个列的约束信息
  271.     EOPE_TYPE GetOptype();
  272.     //得到一个列的约束的操作类型
  273.     pCreate_Column GetColForCheck(char* str,pCreate_Column pHead);
  274.     //得到有关一个列的约束类型,是 enum Operator_Type {B, BE, L, LE, E, NE,BETWEEN} 中的一种 
  275.     void SetMin_Max(COLVAL& min,COLVAL& max,EOPE_TYPE optype,ECOL_TYPE coltype,bool next = 1);
  276.     //根据optype给min和max赋值,当前StrNow必须处在处理的有意字串上
  277.     void SetMin_Max(COLVAL temp,COLVAL& min,COLVAL& max,EOPE_TYPE optype,ECOL_TYPE coltype);
  278.     //重载SetMin_Max,利用temp的值配合optype和coltype来给min和max赋值
  279.     void SetColValFStr(ECOL_TYPE& coltype,COLVAL& tColval,bool next = 1);
  280.     //得到有关一个输入的字串为和类型(I,C,F)及对相应的tColVal赋值
  281.     pSel_Col   GetSelColList(int& iColNum);
  282.     //** 功能描述:得到select中关于字段(列名)的列表
  283.     pSel_Cond  GetCondList(int& iCondNum);
  284.     //得到select,update,delete,insert中有关条件的描述信息的列表
  285.     pIns_Col GetInsValList(int& iValNum);
  286.     //得到一个有关Insert函数中所有的输入的值得链表
  287.     pUpd_Col GetUpdColList(int &iColNum);
  288.     //得到Update中关于字段(列名)及其值的列表
  289.  };
  290.  ECMD_TYPE GetCommand(TB_Create_Info**,TB_Select_Info**,TB_Insert_Info**,TB_Update_Info**,TB_Delete_Info**);
  291.  //该模块的主函数,负责所有操作
  292.  char ChUpToLowCase(char);
  293.  //将一个大写字母换成小写,否则原样返回
  294.  char* FilterQuota(char* strin);
  295.  //负责将一个字符串中的单引号过滤,如FilterQuota("'abc'") == "abc"
  296.  bool CompStrEver(char* str1,char* str2);
  297.  //比较两个字符串是否相等,忽略大小写,return 1--相同,0---不同
  298.  void SaveKeyChar(char* str,int* index,char In);
  299.  //保存关键的由于辨别有意字串的关键字符,如回车,在InitialInput()中调用
  300.  void SetCurLocation(char* str);
  301.  //将当前的路径设置好
  302.  void SetCurRelation(char* str);
  303.  //将当前的表名设置好
  304.  void ShowHelp();
  305.  //显示帮助信息
  306.  void QuitSQL();
  307.  //退出MiniSQL
  308.  void ShowMsg();
  309.  //在屏幕上打印消息
  310.  void GnlTrwErr(int);
  311.  //Generally Throw the Errors,一般性错误,如db不存在
  312.  void ResetDBinfo();
  313.  //删除当前正在使用的数据库后对有关数据库路径和名称信息的重新设置
  314.   
  315. #endif// INTEPRETOR_HPP