?? intepretor.cpp
字號:
}
void Create_Column::SetColValfloat(EOPE_TYPE optype,float fMin,float fMax)
{
/*****************************************************************
將Create_Column()里未根據(jù)實(shí)際初始的min.FloatValue,max.FloatValue初始一下
****************************************************************/
OperType = optype;
min.FloatValue = fMin;
max.FloatValue = fMax;
}
/*****************************************************************
** 輸 出: --- 表示一個(gè)完整的有關(guān)Insert操作的參數(shù)類
** 功能描述:負(fù)責(zé)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); //<--- 檢驗(yàn)輸入的該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) //<--- 不是第一個(gè)值
PassCommon(","); //<--- 各值以" , "相隔
else
FirstTime = 0;
SetColValFStr(ColType,value);
pTemp = new Ins_Col("*",ColType,value); //<--- 設(shè)置好各個(gè)列值
if(pHead == 0)
{pHead = pTemp;
pTail = pTemp;
}
else{
pTail->next = pTemp;
pTail = pTemp;}
}
while(CompStrEver(StrNow->str,","));
return pHead;
}
/*****************************************************************
** 輸 出: --- 表示一個(gè)完整的有關(guān)Select操作的參數(shù)類,負(fù)責(zé)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); //<--- 檢驗(yàn)輸入的該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中有關(guān)條件的描述信息的列表--->
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; //<--- 關(guān)系運(yùn)算符
do{
iCondNum++;
if(!FirstTime)
PassCommon("and");
else
FirstTime = 0;
strcpy(PriKey,StrNow->str);
NextStr(); //<--- 獲得第一個(gè)條件的列名
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;
}
//<--- 功能描述:得到有關(guān)一個(gè)輸入的字串為和類型(I,C,F)及對相應(yīng)的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] == '.') //<--- 存在點(diǎn)號,則說明是float
NotFind = 0;
if(NotFind == 0)
{
tColVal.FloatValue = atof(StrNow->str);
coltype = F;
}
else
{
tColVal.IntValue = atoi(StrNow->str);
coltype = I;
}
}
if(next)
NextStr(); //<--- 轉(zhuǎn)到下一個(gè)條件上
}
//<--- 功能描述:得到select中關(guān)于字段(列名)的列表
pSel_Col Ch_csVstrBlk::GetSelColList(int& i)
{
pSel_Col pHead = 0,pTail,pTemp = 0;
pHead = new Sel_Col(StrNow->str);
pTail = pHead; //<--- 得到第一個(gè)列名
i++;
NextStr();
while(!CompStrEver(StrNow->str,"from")) //<--- 當(dāng)不是from(應(yīng)該是" , ")時(shí),說明還有列名
{
PassCommon(",");
pTemp = new Sel_Col(StrNow->str);
NextStr();
pTail->next = pTemp;
pTail = pTemp;
i++; //<--- 計(jì)算列名的數(shù)量
}
return pHead;
}
/*****************************************************************
** 輸 出: --- 表示一個(gè)完整的有關(guān)Update操作的參數(shù)類,負(fù)責(zé)Update命令的所有操作
** 全局變量: PassCommon()
****************************************************************/
TB_Update_Info* Ch_csVstrBlk::CH_Update()
{
char* strTableName = 0; //<--- 要執(zhí)行修改的表名
Update_Column* pUpd_ColHead = 0; //<--- 所要修改的字段及其值的鏈表
pConds pCond_Head = 0; //<--- 修改的范圍的查詢條件鏈表
int iColNum = 0; //<--- 字段數(shù)
int iCondNum = 0; //<--- 條件數(shù)
TB_Update_Info* tbReturn = 0;
strTableName = GetTBName(); //<--- 得到表名
if(!CheckTB(strTableName))
GnlTrwErr(NOSUCHTB); //<--- 檢驗(yàn)輸入的該table是否存在
SetCurRelation(strTableName); //<--- 保存表名
PassCommon("set"); //<--- 過濾set,進(jìn)入取得列名鏈表階段
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中要重新設(shè)值的列名
{ 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)
pTail = pTemp;
}
else{
pTail->next = pTemp;
pTail = pTemp;} //<--- 鏈到鏈表中
}while(CompStrEver(StrNow->str,",")); //<--- 如果以','結(jié)尾,說明可能是多個(gè)列同時(shí)更新值
return pHead;
}
TB_Delete_Info* Ch_csVstrBlk::CH_Delete()
{ char* strTableName = 0; //<--- 要執(zhí)行修改的表名
pConds pCond_Head = 0; //<--- 所要修改的字段及其值的鏈表
int iCondNum = 0; //<--- 條件數(shù)
TB_Delete_Info* tbReturn = 0;
PassCommon("from");
strTableName = GetTBName(); //<--- 取得表名
if(!CheckTB(strTableName))
GnlTrwErr(NOSUCHTB); //<--- 檢驗(yàn)輸入的該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); //<--- 檢驗(yàn)輸入的該database是否存在
SetCurLocation(dbname); //<--- 根據(jù)該輸入設(shè)置好當(dāng)前路徑
strcpy(CurDB,dbname); //<--- 設(shè)置好當(dāng)前的數(shù)據(jù)庫
ShowTable();
}
void Ch_csVstrBlk::DropTB()
{
if(CompStrEver(StrNow->str,";"))
ThrowStrErr(COMMON,iNumNowInVstr);//<--- 可能漏輸database name
if(CompStrEver(CurDB,""))
GnlTrwErr(NODBUSED); //<--- 如果該數(shù)據(jù)庫不存在,則出錯(cuò)
char* tbname = StrNow->str;
NextStr();
PassCommon(";"); //<--- 在table name后不能有其他的輸入
if(!CheckTB(tbname))
GnlTrwErr(NOSUCHTB); //<--- 檢驗(yàn)輸入的該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); //<--- 檢驗(yàn)輸入的該database是否存在
SetCurLocation(dbname); //<--- 根據(jù)該輸入設(shè)置好當(dāng)前路徑
strcpy(CurDB,dbname); //<--- 設(shè)置好當(dāng)前的數(shù)據(jù)庫
}
// 創(chuàng)建一個(gè)數(shù)據(jù)庫--->
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); //<--- 檢驗(yàn)輸入的該database是否存在
CreateDB(dbname);
}
/***********************普通函數(shù)***********************/
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)
/*****************************************************************
** 功能描述:
比較兩個(gè)字符串是否相等,忽略大小寫,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,即比較的結(jié)果是str1與str2相等
else
return 0;
}
void SaveKeyChar(char* str,int* index,char in)
/*****************************************************************
** 輸 入: str,index,in
** str--- 目標(biāo)字符串?dāng)?shù)組
** index--- 字符所要保存的位置
** in--- 所要保存的字符
** 功能描述:
保存關(guān)鍵的由于辨別有意字串的關(guān)鍵字符,如回車,在InitialInput()中調(diào)用
****************************************************************/
{
if(str[*index-1] != 0)
str[(*index)++] = 0;
str[(*index)++] = in;
str[(*index)++] = 0;
}
// 將一個(gè)大寫字母換成小寫,否則原樣返回 --->
char ChUpToLowCase(char chIn)
{
if(chIn >= 'A' && chIn <= 'Z')
chIn += 32;
return chIn;
}
// 將當(dāng)前的路徑設(shè)置好 --->
void SetCurLocation(char* str)
{
strcpy(CurLocation,"..\\data\\");
strcat(CurLocation,str);
strcat(CurLocation,"\\");
}
// 將當(dāng)前的表名設(shè)置好 --->
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,一般性錯(cuò)誤,如db不存在
void GnlTrwErr(int ErrType)
{
GnlErrInfo eErrTemp;
eErrTemp.iErrType = ErrType;
throw(eErrTemp);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -