📄 intepretor.cpp
字号:
}
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 + -