亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? intepretor.cpp

?? 實現一個精簡型單用戶SQL引擎(DBMS)MiniSQL
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
/****************************************************************** 

** 文件名: Intepretor.cpp

** Copyright (c) 2001-2002 計算機99F MiniSQL開發小組其一 

** 創建人: 王淮

** 日  期: 2001-12_10

** 修改人: 王淮

** 日  期: 2002-01-07

** 描  述: 定義了MiniSQL Intepretor模塊除對磁盤文件操作之外的所有類和結構

** 版  本: 1.00

******************************************************************/

#include "Intepretor.h"
#include "Glob_Var.h"

extern char CurLocation[256];
//<---存有當前正在使用的表的相對路徑,如"../data/db1/"下存有book這張表
extern char CurRelationName[33];
//<---存當前表的表名
char CurDB[33] = "";

//---enum ErrType {RESOLVE,COMMON,COLUMNTYPE,KEYWORD,
//---COLNAMEERR_IN_CHECK,GET_OP_ERR,NOCOL};
//---用于拋出字串輸入錯誤時輸出錯誤提示使用
char* ppErr[] = {"Can't Resolve this command,It may not a correct command!",
				  "Common typing error!",
				  "The type of the data is wrong,we only support the \'char\',\'float\',\'int\' types!",
				  "Please type the correct keyword!--like \'NotNull\',\'imary\'",
				  "Your Column name typed in the Check straint doesn\'t exist!",
				  "May we does't support your operator typed,if you can make sure you have no typing error!",
				  "You must specify at least one Column for us to select it!"};

//<--- enum GnlErrType{NOSUCHDB,NODBUSED,SUCHDBEXIST};
//<---用于拋出一般性錯誤時輸出錯誤提示使用
char* ppGnlErr[] = {"The DB doesn\'t exist!",
          "The Table doesn\'t exist!",
					"You haven\'t choose a database!",
					"This DB has already existed!",
  				"This Table has already existed!",
          "You must have 2  \' to match each other!",
          "No primary key exists!"};

 ECMD_TYPE GetCommand(TB_Create_Info** ptrCreateInfo,TB_Select_Info** ptrSelectInfo,TB_Insert_Info** ptrInsertInfo,TB_Update_Info** ptrUpdateInfo,TB_Delete_Info** ptrDeleteInfo)

 {
   ECMD_TYPE CmdType = UNORMAL;//<---假設給出的命令是非正常的
   try{
   //--->打出提示信息
   std::cout<<'\n';
   std::cout<<"MiniSQL->";
   Ch_csVstrBlk CommandInput;
   //<---開始作解析命令的嘗試	

	CmdType = CommandInput.ResolveCmd();
    //<---開始對輸入的是何命令作解析,由ResolveCmd()對第一個有意字串作判斷
	if(CmdType != USE && CmdType != HELP && CmdType != QUIT
       && CmdType != SHOWDB && CmdType != DROP&&CmdType != NEW)
    //<---以下命令必須在選擇數據庫后才能執行
	{if(CompStrEver(CurDB,""))
        { CmdType = UNORMAL;
       GnlTrwErr(NODBUSED);}   
	}
   switch(CmdType)                //<---選擇命令
     {
     case CREATE:
      *ptrCreateInfo = CommandInput.CH_Create();
      //<---對非該命令的指針賦0
 	  *ptrSelectInfo=0;
	  *ptrInsertInfo=0;
	  *ptrUpdateInfo=0;
	  *ptrDeleteInfo = 0;
     return CREATE;
     break;
     
  	 case SELECT:
	  *ptrSelectInfo = CommandInput.CH_Select();
	  *ptrCreateInfo=0;
	  *ptrInsertInfo=0;
	  *ptrUpdateInfo=0;
	  *ptrDeleteInfo = 0;
	 return SELECT;
     break;
     
	 case INSERT:
 	  *ptrInsertInfo = CommandInput.CH_Insert();
	  *ptrCreateInfo=0;
	  *ptrSelectInfo=0;
	  *ptrUpdateInfo=0;
	  *ptrDeleteInfo = 0;
	 return INSERT;
     break;

     case UPDATE:
	  *ptrUpdateInfo = CommandInput.CH_Update();
	  *ptrCreateInfo=0;
	  *ptrSelectInfo=0;
	  *ptrInsertInfo=0;
	  *ptrDeleteInfo = 0;
     return UPDATE;
     break;

     case DELETE:
	  *ptrDeleteInfo = CommandInput.CH_Delete();
	  *ptrCreateInfo=0;
	  *ptrSelectInfo=0;
	  *ptrInsertInfo=0;
	  *ptrUpdateInfo=0; 
	 return DELETE;
     break;
     
     case USE:                    //<---選擇數據庫
	  *ptrDeleteInfo = 0;
	  *ptrCreateInfo=0;
	  *ptrSelectInfo=0;
	  *ptrInsertInfo=0;
	  *ptrUpdateInfo=0;
	  CommandInput.ChoseDatabase();
	 return USE;
     break;

     case DROP:
	  *ptrCreateInfo=0;
	  *ptrSelectInfo=0;
	  *ptrInsertInfo=0;
	  *ptrUpdateInfo=0;
	  *ptrDeleteInfo = 0;
      CommandInput.DropTB();
	 return DROP;
     break;
	
     case DROPDB:
	  *ptrCreateInfo=0;
	  *ptrSelectInfo=0;
	  *ptrInsertInfo=0;
	  *ptrUpdateInfo=0;
	  *ptrDeleteInfo = 0;
      CommandInput.DropDB();
	 return DROPDB;
     break;

	 case NEW:
	  *ptrCreateInfo=0;
	  *ptrSelectInfo=0;
	  *ptrInsertInfo=0;
	  *ptrUpdateInfo=0;
	  *ptrDeleteInfo = 0;
      CommandInput.NewDB();
	 return NEW;
     break;

     case QUIT:			          //<---像該種單詞命令直接檢查合法性,其余命令皆在其函數內部檢查
	  CommandInput.PassCommon(";");
	  *ptrCreateInfo=0;
	  *ptrSelectInfo=0;
	  *ptrInsertInfo=0;
	  *ptrUpdateInfo=0;
	  *ptrDeleteInfo = 0;
	  QuitSQL();
	 return QUIT;
     break;

	 case SHOWDB:
	  *ptrCreateInfo=0;
	  *ptrSelectInfo=0;
	  *ptrInsertInfo=0;
	  *ptrUpdateInfo=0;
	  *ptrDeleteInfo = 0;         //<---指針置0
	  ShowDB();
	 break;

	 case SHOWTABLE:
	  *ptrCreateInfo=0;
	  *ptrSelectInfo=0;
	  *ptrInsertInfo=0;
	  *ptrUpdateInfo=0;
	  *ptrDeleteInfo = 0;
	  //<---指針置0
	  if(CompStrEver(CurDB,""))
		 GnlTrwErr(NODBUSED);
	  ShowTable();
	 break;

	 case HELP:                   //<---像該種單詞命令直接檢查合法性,其余命令皆在其函數內部檢查
	  CommandInput.PassCommon(";");
	  *ptrCreateInfo=0;
	  *ptrSelectInfo=0;
	  *ptrInsertInfo=0;
	  *ptrUpdateInfo=0;
	  *ptrDeleteInfo = 0;          //<---指針置0
	  ShowHelp();
	 break;

     default :
	  *ptrCreateInfo=0;
	  *ptrSelectInfo=0;
	  *ptrInsertInfo=0;
	  *ptrUpdateInfo=0;
	  *ptrDeleteInfo = 0;
     break;
     }
	}

	catch(ErrInfo a)
    //字串輸入錯誤,給出提示--->
{	
	std::cout<<"The Error near \'"<<a.pErrStr<<"\'"<<"in Line "<<a.iLineNo<<" may be: \n";
	std::cout<< ppErr[a.iErrType]<<'\n';
    CmdType = UNORMAL;
}

	catch(GnlErrInfo a)
    //一般性錯誤--->
{
	std::cout<< ppGnlErr[a.iErrType]<<'\n';
	std::cout<< "Please type \'help\' to get help!\n";
  CmdType = UNORMAL;
}
 
   return CmdType;
 }

//構造函數,對輸入進行處理,產生一個有以字串的集合--->
Ch_csVstrBlk::Ch_csVstrBlk()
{ 
  InitialVar();         //<---初始化輸入字串
  MakeVstrBlkList();    //<---生成有意字串塊的鏈表
}


void Ch_csVstrBlk::InitialVar()
{
  //初始化某些參數--->
  StrHead = 0;
  StrNow  = 0;
  StrTail = 0;
  iNumNowInVstr = 0;
  iLineNum[0][0] = 0;
  sta_i = 0;
  strInputCharList = InitialInput();
}

//對輸入進行處理,產生一個有意字串的集合--->
void Ch_csVstrBlk::MakeVstrBlkList()
{
  int flag;
  int iForLineNum = 0;
  char* tempStr;
  VSTR_BLK_PTR vbNewBlk;
  do
  {
    flag = InString(&tempStr);
    //<---可能在字符串拷貝時會出錯,小心
    if(flag == 0)
    { 
        //<---返回有意字串
        iNumNowInVstr++;
        //<---有意字串個數加1
        {vbNewBlk = new VSTR_BLK;
        vbNewBlk->str = tempStr;
        vbNewBlk->next = 0;
        if(StrHead == 0)
          StrHead = vbNewBlk;
        else
			StrTail->next = vbNewBlk;
        StrTail = vbNewBlk;
        }
        //<---生成一個有意字串的結構體,并將它鏈成鏈表
    }

    else
    {   //<--- 回車,說明行數加一
        iLineNum[iForLineNum++][1] = iNumNowInVstr;
        //<--- 原來末行的末地址
        iLineNum[iForLineNum][0] = iNumNowInVstr + 1;
        //<--- 新行的首地址
    }
  }
  while(CompStrEver(tempStr,"\xff") != 1);
    //<--- 得到的是"\xff"時,表示用戶輸入已經結束
  
  iNumNowInVstr = 0;
  //<--- 再次初始化iNumNowInVstr,用于正式輸入處理時的位置計算
  StrNow = StrHead;
  //<--- 將StrNow指到StrHead上

}


bool Ch_csVstrBlk::InString(char** ObjectStr)
/*********************************************************
          return = 0,有意字串
          return = 1,回車  
*********************************************************/
/*
 */
{
  int i = 0;
   
  char chTemp;
  *ObjectStr = new char[NAMEMAXLEN];
  if((chTemp = strInputCharList[sta_i++]) != '\0')
    (*ObjectStr)[i++] = chTemp;
  //<--- 第一個字符如果為空,則必須略過
  do{
	  chTemp = strInputCharList[sta_i++];
	  (*ObjectStr)[i++] = chTemp;
  }
  while(chTemp != '\0');
  if(CompStrEver(*ObjectStr, "\n"))
    return 1;//<--- 回車
  else
    return 0;//<--- 有意字串
}

char* Ch_csVstrBlk::InitialInput()
{  
/*********************************************************
過濾空格信息,只留下回車和其他字符,對于有意字串用'\0'來區分,
對于字串的結束,用'\xff'來表示
共有5種辨別有意字串的字符
--- 空格, 逗號,分號,左括號,右括號,,左單引號,右單引號,回車
***checked 2001-12-5***
*********************************************************/
  char* strResult;
  strResult = new char[INPUTMAX];
  char tempIn;
  int i = 0;
  int DoGetcharFlag = 1;
  int MaybeEnd = 0;
  int EndFlag = 0;
  do{
     if(DoGetcharFlag)
      {
		 tempIn = getchar();
      }
    else
    DoGetcharFlag = 1;
    switch(tempIn)
    {
    case ' ' :                    //<--- 略空格
        {
	    if(strResult[i - 1] != 0)
			strResult[i++] = 0;
        do{
          	tempIn = getchar();  
          }while(tempIn == ' ');  //<--- 過濾空格
         DoGetcharFlag = 0;       //<--- 則新的循環中無需再讀入一個字符
        }
    break;
       
    case ';' :                    //<--- 輸入結束標志
         SaveKeyChar(strResult,&i,tempIn);
         MaybeEnd = 1;            //<--- 表示可能是輸入結束,MaybeEnd在下一次輸入回車時會用到
    break;
    case ',' :
    case '(' :
    case ')' :
    case '>' :
    case '<' :
    case '=' :
         SaveKeyChar(strResult,&i,tempIn);
    break;
    case '\'' :                   //<--- 在回車之前必須得到另外一個 ' 以作匹配
	     strResult[i++] = tempIn;
         while( (tempIn = getchar())!='\n' &&tempIn != ','&&tempIn!= '\''&&tempIn!= ';')
           strResult[i++] = tempIn;
         if(tempIn == '\'')
		        {strResult[i++] = tempIn;
	           strResult[i++] = '\0';}
         else{
           do{tempIn=getchar();}while(tempIn !='\n');
                GnlTrwErr(WITHOUTMATCH);//<---  單引號不匹配
         }
    break;
    case '\n' :
         if(MaybeEnd == 0)
		 {
          // 回車后將呈現的提示符 --->
	      std::cout<<"       ->";
          SaveKeyChar(strResult,&i,tempIn);
		 }
         else                       //<--- 這一次是整個命令的正式結束
		 {SaveKeyChar(strResult,&i,tempIn);
		 EndFlag = 1;}
    break;
    default :                       //<--- 一般的字符輸入
         strResult[i++] = tempIn;
    break;
    } 
  }
  while(EndFlag == 0 && i < INPUTMAX);//<--- 檢查何種原因退出循環
  SaveKeyChar(strResult,&i,'\xff');
  strResult[i] = '\0';
  return strResult;
}


TB_Create_Info* Ch_csVstrBlk::CH_Create()
 /***************************************************************** 
** 輸 出: ---  表示一個完整的有關Create操作的參數類
** 功能描述:負責Create命令的所有操作
** 調用模塊: PassCommon()
****************************************************************/ 
{
  // 命令輸入應該如:create table tablename(columnname,type);
  char* strTableName = 0;
  TB_Create_Info* tbReturn;
  pCreate_Column	pTemp = 0,pHead = 0,pTail = 0;
  int iColNum = 0;
  bool NotEnd = 1;
  bool bPriKeyExist = 0;                    //<--- 用于判斷Primary key是否存在的標志
  PassCommon("table");
  strTableName = GetTBName();               //<--- 取得表名
  if(CheckTB(strTableName))
		GnlTrwErr(SUCHTBEXIST);             //<--- 檢驗輸入的該table是否存在,存在則給出錯誤
  SetCurRelation(strTableName);
  PassCommon("(");
  do                                        //<--- 取得各個列定義的名稱和類型
  {
   if(CompStrEver(StrNow->str,"check"))
     GetCheckInfo(&NotEnd,pHead);           //<--- 該行是有關列的約束信息
   else
   {pTemp = GetColumnInfo(&NotEnd,bPriKeyExist);
   iColNum++;                               //<--- 列的數量+1
   if(pHead == 0)
    {pHead = pTemp;
     pTail = pTemp;
    }
   else{
	 pTail->next = pTemp;
	 pTail = pTemp;}
   }

  }while(NotEnd);
  PassCommon(")");
  PassCommon(";");
  if(bPriKeyExist == 0)                     //<--- primary key不存在
    GnlTrwErr(NOPRIMARYKEY);
  tbReturn = new TB_Create_Info(iColNum,pHead,strTableName);
  //<--- 生成該表
  return tbReturn;
}

void Ch_csVstrBlk::GetCheckInfo(bool *NotEnd,pCreate_Column pHead)
{ 
/***************************************************************** 
** 功能描述:得到有關一個列的約束信息
****************************************************************/ 
char* strColName = new char[NAMEMAXLEN];
EOPE_TYPE optype;
ECOL_TYPE coltype;
COLVAL tmin;
COLVAL tmax;
pCreate_Column pColtemp = 0;
PassCommon("check");
PassCommon("(");
pColtemp = GetColForCheck(StrNow->str,pHead);         //<--- 得到check中列的各個信息
optype = GetOptype();                                 //<--- 得到所要check的列的操作類型
coltype = pColtemp->ColType;                          //<--- 賦所要check的列的數據類型(char,int,float)中的一種
if(optype == BETWEEN)                                 //<--- BETWEEN AND 比較特殊,單獨處理
  {PassCommon("between");
   switch(coltype)                                    //<--- 根據數據類型給約束條件賦值

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产日韩综合久久精品| 亚洲视频综合在线| www国产精品av| 色88888久久久久久影院按摩| 男女性色大片免费观看一区二区| 中文字幕色av一区二区三区| 亚洲精品一区二区三区香蕉| 春色校园综合激情亚洲| 国产在线播放一区| 国产精品亚洲а∨天堂免在线| 美女www一区二区| 久久久国产精品午夜一区ai换脸| 日韩午夜精品电影| 91精品综合久久久久久| 7777精品伊人久久久大香线蕉完整版 | 日韩久久久精品| 日韩欧美一级片| 日韩精品专区在线| 欧美日韩免费不卡视频一区二区三区| 成人伦理片在线| 欧美日韩aaa| 国产日韩精品一区二区浪潮av| 国产精品久久久一本精品| 综合久久国产九一剧情麻豆| 五月激情综合婷婷| 国产精品99久久久久| 色综合天天天天做夜夜夜夜做| 91精品国产高清一区二区三区| 欧洲av一区二区嗯嗯嗯啊| 精品国产乱码久久久久久牛牛| 欧美极品美女视频| 日韩成人午夜精品| 91老司机福利 在线| 日韩美女视频一区二区在线观看| 亚洲欧美日韩久久| 国产91富婆露脸刺激对白| 欧美日韩综合一区| 欧美国产激情一区二区三区蜜月| 欧美日韩五月天| 久久蜜臀中文字幕| 日韩va亚洲va欧美va久久| 欧美日韩免费高清一区色橹橹| 国产偷v国产偷v亚洲高清| 国产一区福利在线| 日韩欧美国产精品一区| 亚洲成av人影院在线观看网| 99久久久无码国产精品| 中文字幕在线不卡| 91蜜桃网址入口| 一区二区在线观看av| 色悠悠久久综合| 亚洲成人自拍一区| www.性欧美| 亚洲欧洲制服丝袜| 欧美午夜精品免费| 国产福利一区在线| 日韩免费电影一区| 国产精品久久久久久久第一福利 | 欧美激情中文字幕一区二区| 亚洲综合色噜噜狠狠| 国内精品免费**视频| 日韩美女视频在线| 色一区在线观看| 国产一区二区看久久| 中文字幕一区二区三区视频| 91成人免费网站| 久久se精品一区二区| 久久久噜噜噜久久中文字幕色伊伊 | 精品理论电影在线观看 | 国产日本欧洲亚洲| 2020国产精品| 成人av片在线观看| 日欧美一区二区| 国产精品欧美经典| 欧美mv日韩mv亚洲| 欧美日韩免费在线视频| www.亚洲激情.com| 精品一区二区影视| √…a在线天堂一区| 欧美zozozo| 精品日韩成人av| 欧美一级片免费看| 91精品婷婷国产综合久久性色| 91久久奴性调教| 欧美性猛片aaaaaaa做受| 欧洲激情一区二区| 欧美电影一区二区| heyzo一本久久综合| 丰满白嫩尤物一区二区| 国产成人亚洲综合a∨猫咪| 国产精品一区二区三区四区| 狠狠久久亚洲欧美| 国产麻豆成人传媒免费观看| 国产成人av影院| 岛国精品在线播放| 欧美午夜影院一区| 日韩三级精品电影久久久| 日韩午夜小视频| 欧美国产一区视频在线观看| 欧美激情一区不卡| 依依成人综合视频| 亚洲va国产天堂va久久en| 男女视频一区二区| 成人99免费视频| 欧美精品少妇一区二区三区| 欧美电影免费观看高清完整版| 欧美国产日韩a欧美在线观看| 亚洲欧美日韩国产中文在线| 久久福利视频一区二区| 91视频国产观看| 欧美videofree性高清杂交| 国产精品午夜在线| 丝袜美腿一区二区三区| 国产成人精品免费网站| 91在线码无精品| 欧美精品一区二区三区高清aⅴ | 国产精品久久久一本精品| 热久久国产精品| 欧美无人高清视频在线观看| 亚洲色图.com| 不卡影院免费观看| 国产午夜亚洲精品理论片色戒 | 丁香另类激情小说| 精品人在线二区三区| 亚洲国产综合91精品麻豆| 国产精品99精品久久免费| 欧美一区二区三区人| 亚洲va国产天堂va久久en| 91视频精品在这里| 亚洲女人的天堂| 91麻豆高清视频| 亚洲伊人伊色伊影伊综合网 | 欧美不卡一区二区三区四区| 麻豆国产欧美一区二区三区| 欧美变态口味重另类| 激情五月激情综合网| 精品福利一区二区三区| 亚洲综合清纯丝袜自拍| 国产suv精品一区二区三区| 久久婷婷综合激情| 国产曰批免费观看久久久| 91精品国产美女浴室洗澡无遮挡| 毛片av中文字幕一区二区| 欧美变态凌虐bdsm| 成人黄色电影在线 | 国产精品99久久久| 亚洲日本免费电影| 欧美色国产精品| 国内欧美视频一区二区| 亚洲五码中文字幕| 欧美一区二区三区白人| 国产精品1区二区.| 亚洲自拍偷拍图区| 国产日韩av一区二区| 欧美猛男gaygay网站| 狠狠色狠狠色合久久伊人| 国产精品久久久久9999吃药| 欧美色视频一区| 国产麻豆视频精品| 日本中文一区二区三区| 亚洲女人的天堂| 久久九九影视网| 久久这里都是精品| 日韩精品在线一区二区| 波多野结衣中文字幕一区二区三区| 亚洲国产一区二区三区青草影视| 国产精品美女久久福利网站| 欧美一级艳片视频免费观看| 91黄色小视频| 色8久久人人97超碰香蕉987| 国产永久精品大片wwwapp| 日韩电影在线一区| 日韩av电影免费观看高清完整版| 亚洲日韩欧美一区二区在线| 亚洲日韩欧美一区二区在线| 国产精品你懂的在线欣赏| 久久午夜老司机| 久久这里只有精品首页| 2020日本不卡一区二区视频| 欧美成人乱码一区二区三区| 日韩视频一区在线观看| 91精品国产91热久久久做人人 | 色婷婷综合久久久久中文一区二区| 丁香婷婷综合网| 不卡的av网站| 欧美中文字幕一区| 欧美一区欧美二区| 亚洲与欧洲av电影| 日本va欧美va瓶| 国产成人精品亚洲777人妖| 成人精品国产一区二区4080| 成人免费视频免费观看| 91麻豆免费看| 日韩精品中午字幕| 国产精品你懂的在线欣赏| 依依成人综合视频| 国产精品88888| 欧美日韩国产小视频在线观看| 久久亚洲综合色| 亚洲一区二区在线播放相泽|