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

📄 intepretor.cpp

📁 实现一个精简型单用户SQL引擎(DBMS)MiniSQL
💻 CPP
📖 第 1 页 / 共 3 页
字号:
}
void Create_Column::SetColValfloat(EOPE_TYPE optype,float fMin,float fMax)
{
/***************************************************************** 
将Create_Column()里未根据实际初始的min.FloatValue,max.FloatValue初始一下
****************************************************************/
  OperType = optype;
  min.FloatValue = fMin;
  max.FloatValue = fMax;
}

/***************************************************************** 
** 输 出: ---  表示一个完整的有关Insert操作的参数类
** 功能描述:负责Insert命令的所有操作
** 全局变量: PassCommon()
****************************************************************/ 
TB_Insert_Info* Ch_csVstrBlk::CH_Insert()
{
  char* strTableName = 0;						//<--- 所要插入的表名
  TB_Insert_Info* tbReturn = 0;
  pIns_Col	pHead = 0;
  int iValNum = 0;								//<--- 链表长度

  //<--- 取得insert插入值列表
  PassCommon("into");
  strTableName = GetTBName();           //<--- 取得表名
  if(!CheckTB(strTableName))
		GnlTrwErr(NOSUCHTB);            //<--- 检验输入的该table是否存在
  SetCurRelation(strTableName);         //<--- 保存表名
  PassCommon("values");
  PassCommon("(");
  pHead = GetInsValList(iValNum);       //<--- 取得插入值序列
  PassCommon(")");
  PassCommon(";");
  tbReturn = new TB_Insert_Info(strTableName,pHead,iValNum);

  return tbReturn;
}

pIns_Col Ch_csVstrBlk::GetInsValList(int& iValNum)
{
    pIns_Col pHead = 0,pTail,pTemp = 0;
	Column_Type			ColType;				//<--- 此字段的类型
	COLVAL		value;
	int FirstTime = 1;

	do{
	iValNum++;
	if(!FirstTime)                              //<--- 不是第一个值
	  PassCommon(",");                          //<--- 各值以" , "相隔
	else 
		FirstTime = 0;
	SetColValFStr(ColType,value);

	pTemp = new Ins_Col("*",ColType,value);     //<--- 设置好各个列值
    if(pHead == 0)
    {pHead = pTemp;
     pTail = pTemp;
    }
   else{
	 pTail->next = pTemp;
	 pTail = pTemp;}
	}
	while(CompStrEver(StrNow->str,","));

	return pHead;
}


/***************************************************************** 
** 输 出: ---  表示一个完整的有关Select操作的参数类,负责Select命令的所有操作
** 全局变量: PassCommon()ThrowStrErr()GetSelColList()CheckTB()
GnlTrwErr()SetCurRelation()TB_Select_Info()GetCondList()
****************************************************************/ 
TB_Select_Info* Ch_csVstrBlk::CH_Select()
{
  char* strTableName = 0;
  TB_Select_Info* tbReturn = 0;
  pSel_Col	pSel_ColHead = 0;
  pSel_Cond pCond_Head = 0;
  int iColNum = 0;
  int iCondNum = 0;
  bool NotEnd = 1;

  if(CompStrEver(StrNow->str,"from"))
    ThrowStrErr(NOCOL,iNumNowInVstr);
  else
    pSel_ColHead = GetSelColList(iColNum);
  //<--- 取得select 列名列表
  PassCommon("from");
  strTableName = GetTBName();
  //<--- 得到表名
  if(!CheckTB(strTableName))
		GnlTrwErr(NOSUCHTB);           //<--- 检验输入的该table是否存在

  SetCurRelation(strTableName);        //<--- 保存表名
  if(CompStrEver(StrNow->str,";"))
    {iCondNum = 0;pCond_Head = 0;}
  else
    {PassCommon("where");
    pCond_Head = GetCondList(iCondNum);} //<--- 得到条件链表
  tbReturn = new TB_Select_Info(strTableName,iColNum,pSel_ColHead,iCondNum,pCond_Head);

  return tbReturn;
}


//功能描述:得到select,update,delete,insert中有关条件的描述信息的列表--->
pSel_Cond  Ch_csVstrBlk::GetCondList(int& iCondNum)
{
	pSel_Cond pHead = 0,pTail,pTemp = 0;
	int FirstTime = 1;
    char				PriKey[NAMEMAXLEN];				        //<--- 主键名	
	COLVAL		        tmax;						            //<--- 上限
	COLVAL		        tmin;						            //<--- 下限
	COLVAL              tColVal;
	Column_Type			tColType;
	Operator_Type		tOperType;					            //<--- 关系运算符
	do{
	iCondNum++;
	if(!FirstTime)
	  PassCommon("and");
	else 
		FirstTime = 0;
	strcpy(PriKey,StrNow->str);
	NextStr();                      //<--- 获得第一个条件的列名
	tOperType = GetOptype();        //<--- 得到操作类型
	if(tOperType == BETWEEN)
	{
		PassCommon("between");
		SetColValFStr(tColType,tmin);
		PassCommon("and");
        SetColValFStr(tColType,tmax);
        }
     
	else
	{SetColValFStr(tColType,tColVal);
	SetMin_Max(tColVal,tmin,tmax,tOperType,tColType);}
	
	pTemp = new TSelect_Condition(PriKey,tmin,tmax,tColType,tOperType);
    if(pHead == 0)
    {pHead = pTemp;
     pTail = pTemp;
    }
   else{
	 pTail->next = pTemp;
	 pTail = pTemp;}


	}while(CompStrEver(StrNow->str,"and"));

	return pHead;
}


//<--- 功能描述:得到有关一个输入的字串为和类型(I,C,F)及对相应的tColVal赋值
void Ch_csVstrBlk::SetColValFStr(ECOL_TYPE& coltype,COLVAL& tColVal,bool next)
{
	int i = 0;
	bool NotFind = 1;
	char* strTemp = StrNow->str;
	if(strTemp[0] == '\'')
		{strTemp = FilterQuota(StrNow->str);
		 coltype = C;
		 tColVal.pCharValue = strTemp;
		}
	else
	{
		for(i = 0;strTemp[i] !='\0' && NotFind;i++)
			if(strTemp[i] == '.')           //<--- 存在点号,则说明是float
				NotFind = 0;
		if(NotFind == 0)
		{
			tColVal.FloatValue = atof(StrNow->str);
			coltype = F;
		}
		else
		{
			tColVal.IntValue = atoi(StrNow->str);
			coltype = I;
		}
	}
	if(next)
		NextStr();                          //<--- 转到下一个条件上
}

//<--- 功能描述:得到select中关于字段(列名)的列表
pSel_Col Ch_csVstrBlk::GetSelColList(int& i)
{
	pSel_Col pHead = 0,pTail,pTemp = 0;
	pHead = new Sel_Col(StrNow->str);
	pTail = pHead;                          //<--- 得到第一个列名
	i++;
	NextStr();
	while(!CompStrEver(StrNow->str,"from")) //<--- 当不是from(应该是" , ")时,说明还有列名
	{
		PassCommon(",");
		pTemp = new Sel_Col(StrNow->str);
		NextStr();
	  	pTail->next = pTemp;
		pTail = pTemp;
		i++;                                //<--- 计算列名的数量
}
return pHead;		
}

/***************************************************************** 
** 输 出: ---  表示一个完整的有关Update操作的参数类,负责Update命令的所有操作
** 全局变量: PassCommon()
****************************************************************/ 
TB_Update_Info* Ch_csVstrBlk::CH_Update()
{
  char* strTableName = 0;	               //<--- 要执行修改的表名
  Update_Column*		pUpd_ColHead = 0;  //<--- 所要修改的字段及其值的链表
  pConds 	pCond_Head = 0;                //<--- 修改的范围的查询条件链表
  int		iColNum = 0;		           //<--- 字段数
  int		iCondNum = 0;		           //<--- 条件数
  TB_Update_Info* tbReturn = 0;
  strTableName = GetTBName();              //<--- 得到表名
  if(!CheckTB(strTableName))
		GnlTrwErr(NOSUCHTB);               //<--- 检验输入的该table是否存在
  SetCurRelation(strTableName);            //<--- 保存表名
  PassCommon("set");                       //<--- 过滤set,进入取得列名链表阶段
  pUpd_ColHead = GetUpdColList(iColNum);
  PassCommon("where");
  pCond_Head = GetCondList(iCondNum);      //<--- 得到条件链表
  tbReturn = new TB_Update_Info(strTableName,pUpd_ColHead,iColNum,pCond_Head,iCondNum);
 
  return tbReturn;
}


pUpd_Col Ch_csVstrBlk::GetUpdColList(int &iColNum)
//<--- 得到update中要重新设值的列名
{	pUpd_Col pHead = 0,pTail = 0,pTemp = 0;
	char				ColName[NAMEMAXLEN];		  //<--- 字段名
	Column_Type			ColType;			          //<--- 此字段的类型
	COLVAL		value;
	int FirstTime = 1;
	do{
	iColNum++;
	if(!FirstTime)
	  PassCommon(",");
	else 
		FirstTime = 0;
	strcpy(ColName,StrNow->str);
	NextStr();
	PassCommon("=");
    SetColValFStr(ColType,value);                     //<--- 对该字段的新值和列的值类型赋值
	pTemp = new TUpdate_Column(ColName,ColType,value);//<--- 生成该字段
    if(pHead == 0)
    {pHead = pTemp;
     pTail = pTemp;
    }
   else{
	 pTail->next = pTemp;
	 pTail = pTemp;}                                  //<--- 链到链表中
	}while(CompStrEver(StrNow->str,","));             //<--- 如果以','结尾,说明可能是多个列同时更新值
    return pHead;
}


TB_Delete_Info* Ch_csVstrBlk::CH_Delete()
{  char*    strTableName = 0;	    //<--- 要执行修改的表名
   pConds   pCond_Head = 0;			//<--- 所要修改的字段及其值的链表
   int		iCondNum = 0;		    //<--- 条件数
   TB_Delete_Info* tbReturn = 0;
   PassCommon("from");
   strTableName = GetTBName();      //<--- 取得表名
   if(!CheckTB(strTableName))
		GnlTrwErr(NOSUCHTB);        //<--- 检验输入的该table是否存在
   SetCurRelation(strTableName);    //<--- 保存表名
   PassCommon("where");
   pCond_Head = GetCondList(iCondNum);//<--- 得到条件列表
   tbReturn = new TB_Delete_Info(strTableName,pCond_Head,iCondNum);

   return tbReturn;

}

void Ch_csVstrBlk::ChoseDatabase()
{
	if(CompStrEver(StrNow->str,";"))
		ThrowStrErr(COMMON,iNumNowInVstr);//<--- 可能漏输database name
	char* dbname = StrNow->str;
	NextStr();
	PassCommon(";");                      //<--- 在database name后不能有其他的输入
	if(!CheckDB(dbname))
		GnlTrwErr(NOSUCHDB);              //<--- 检验输入的该database是否存在
	SetCurLocation(dbname);               //<--- 根据该输入设置好当前路径
	strcpy(CurDB,dbname);                 //<--- 设置好当前的数据库
	ShowTable();
}


void Ch_csVstrBlk::DropTB()
{
    if(CompStrEver(StrNow->str,";"))
        ThrowStrErr(COMMON,iNumNowInVstr);//<--- 可能漏输database name
    if(CompStrEver(CurDB,""))
	    GnlTrwErr(NODBUSED);              //<--- 如果该数据库不存在,则出错
	char* tbname = StrNow->str;
	NextStr();
	PassCommon(";");                      //<--- 在table name后不能有其他的输入
	if(!CheckTB(tbname))
		GnlTrwErr(NOSUCHTB);              //<--- 检验输入的该table是否存在
    SetCurRelation(tbname);               //<--- 保存表名

}
	  
void Ch_csVstrBlk::DropDB()
{
	if(CompStrEver(StrNow->str,";"))
		ThrowStrErr(COMMON,iNumNowInVstr);//<--- 可能漏输database name
	char* dbname = StrNow->str;
	NextStr();
	PassCommon(";");                      //<--- 在database name后不能有其他的输入
	if(!CheckDB(dbname))
		GnlTrwErr(NOSUCHDB);              //<--- 检验输入的该database是否存在
    SetCurLocation(dbname);               //<--- 根据该输入设置好当前路径
    strcpy(CurDB,dbname);                 //<--- 设置好当前的数据库
}

// 创建一个数据库--->
void Ch_csVstrBlk::NewDB()
{
	if(CompStrEver(StrNow->str,";"))
		ThrowStrErr(COMMON,iNumNowInVstr);            //<--- 可能漏输database name
	char* dbname = StrNow->str;
	NextStr();
	PassCommon(";");                                  //<--- 在database name后不能有其他的输入
	if(CheckDB(dbname))
		GnlTrwErr(SUCHDBEXIST);                       //<--- 检验输入的该database是否存在
	CreateDB(dbname);

}

 /***********************普通函数***********************/
char* FilterQuota(char* strin)
{
// 将字符串中的''给消去 如'aaa'->aaa --->
	char* strTemp = new char[NAMEMAXLEN];
	int i = 0;
	if(strin[0] != '\'')
		strcpy(strTemp,strin);
	else
	{	for(;strin[i+1]!='\'';i++)
			strTemp[i] = strin[i+1];
		strTemp[i] = '\0';}
	
	return strTemp;
}

 bool CompStrEver(char* str1,char* str2)
/***************************************************************** 
** 功能描述: 
比较两个字符串是否相等,忽略大小写,return 1--相同,0--- 不同
****************************************************************/ 
{  char a,b;
   bool IsSame,NotEnd;
   int i = 0;
   do{
      a = ChUpToLowCase(str1[i]);
      b = ChUpToLowCase(str2[i++]);
      IsSame = (a==b);
      NotEnd = (a!='\0');
    }while(IsSame&&NotEnd);
   if (IsSame == 1)
     return 1;          
   //<--- IsSame == 1,则说明NotEnd == 0,即比较的结果是str1与str2相等
   else
     return 0;
 }

 void SaveKeyChar(char* str,int* index,char in)
/***************************************************************** 
** 输 入: str,index,in 
** str--- 目标字符串数组 
** index---  字符所要保存的位置
** in---  所要保存的字符
** 功能描述: 
保存关键的由于辨别有意字串的关键字符,如回车,在InitialInput()中调用
****************************************************************/
{
  if(str[*index-1] != 0)
    str[(*index)++] = 0;
  str[(*index)++] = in;
  str[(*index)++] = 0;
}

 // 将一个大写字母换成小写,否则原样返回 --->
 char ChUpToLowCase(char chIn)
 {
   if(chIn >= 'A' && chIn <= 'Z')
     chIn += 32;
   return chIn;
 }

// 将当前的路径设置好 --->
 void SetCurLocation(char* str)
 {
	strcpy(CurLocation,"..\\data\\");
	strcat(CurLocation,str);
	strcat(CurLocation,"\\");
 }

 // 将当前的表名设置好 --->
void SetCurRelation(char* str)
 {
	strcpy(CurRelationName,str);
 }

void ShowHelp()
{//<--- 帮助提示信息
std::cout<<"\n\
help        Display this text\
\n\
create      used like \n\
            'create table tablename(valuename type notnull);'\
\n\
select      used like \n\
            'select columnname from tablename where check straint;'\
\n\
delete      used like \n\
            'delete columnname from tablename where check straint;'\
\n\
update      used like \n\
            'update tablename set columnname = columnvalue where check straint;'\
\n\
insert      used like \n\
            'insert into tablename(values);'\
\n\
use         Use another database. used like'use dbname;'\
\n\
showdb      Show all the databases in the MiniSQL\
\n\
showtable   Show all the tables in the current db,\n\
            so you must specify a db first!\
\n\
drop        drop the table if you like,but you must use some db first & specify the table name,like\n\
            'drop tablename;'\
\n\
dropdb      drop the database if you like,you must specify one database,like\n\
            'dropdb dbname;'\
\n\
Exit        Quit mysql,The Same As command quit \n\
\n\
quit        Quit mysql\n"<<'\n';

}

void QuitSQL()
{
	std::cout<<"Thank you for your using MiniSQL!"<<'\n'<<"See you!"<<'\n';
}

void ShowMsg(char* str)
{
	std::cout<<str<<'\n';
}

//<--- Throw the General Errors,一般性错误,如db不存在
void GnlTrwErr(int ErrType)
{
	GnlErrInfo eErrTemp;	
    eErrTemp.iErrType = ErrType;
	throw(eErrTemp);
}

⌨️ 快捷键说明

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