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

其他数据库

开发平台:

C/C++

  1. #include "Intepretor.h"
  2. #include "Glob_Var.h"
  3. extern char CurLocation[256];
  4. //<---存有当前正在使用的表的相对路径
  5. extern char CurRelationName[33];
  6. //<---存当前表的表名
  7. char CurDB[33] = "";
  8. //---用于抛出字串输入错误时输出错误提示使用
  9. char* ppErr[] = {"Not an  available command!",
  10.   "Common typing error!",
  11.   "Wrong type of the data ,you can only use 'char','float','int' ",
  12.   "Please type the correct keyword!--like 'NotNull','imary'",
  13.   "Your Column name doesn't exist!",
  14.   "We does't support your operator typed",
  15.   "You must specify at least one Column for us to select it!"};
  16. //<---用于抛出一般性错误时输出错误提示使用
  17. char* ppGnlErr[] = {"The DB doesn't exist!",
  18.           "The Table doesn't exist!",
  19. "You haven't choose a database!",
  20. "This DB has already existed!",
  21.    "This Table has already existed!",
  22.           "You must have 2  ' to match each other!",
  23.           "No primary key exists!"};
  24.  ECMD_TYPE GetCommand(TB_Create_Info** ptrCreateInfo,TB_Select_Info** ptrSelectInfo,TB_Insert_Info** ptrInsertInfo,TB_Update_Info** ptrUpdateInfo,TB_Delete_Info** ptrDeleteInfo)
  25.  {
  26.    ECMD_TYPE CmdType = UNORMAL;//<---假设给出的命令是非正常的
  27.    try{
  28.    //--->打出提示信息
  29.    std::cout<<'n';
  30.    std::cout<<"MiniSQL->";
  31.    Ch_csVstrBlk CommandInput;
  32.    //<---开始作解析命令的尝试
  33. CmdType = CommandInput.ResolveCmd();
  34.     //<---开始对输入的是何命令作解析,由ResolveCmd()对第一个有意字串作判断
  35. if(CmdType != USE && CmdType != HELP && CmdType != QUIT
  36.        && CmdType != SHOWDB && CmdType != DROP&&CmdType != NEW)
  37.     //<---以下命令必须在选择数据库后才能执行
  38. {if(CompStrEver(CurDB,""))
  39.         { CmdType = UNORMAL;
  40.        GnlTrwErr(NODBUSED);}   
  41. }
  42.    switch(CmdType)                //<---选择命令
  43.      {
  44.      case CREATE:
  45.       *ptrCreateInfo = CommandInput.CH_Create();
  46.       //<---对非该命令的指针赋0
  47.     *ptrSelectInfo=0;
  48.   *ptrInsertInfo=0;
  49.   *ptrUpdateInfo=0;
  50.   *ptrDeleteInfo = 0;
  51.      return CREATE;
  52.      break;
  53.      
  54.     case SELECT:
  55.   *ptrSelectInfo = CommandInput.CH_Select();
  56.   *ptrCreateInfo=0;
  57.   *ptrInsertInfo=0;
  58.   *ptrUpdateInfo=0;
  59.   *ptrDeleteInfo = 0;
  60.  return SELECT;
  61.      break;
  62.      
  63.  case INSERT:
  64.     *ptrInsertInfo = CommandInput.CH_Insert();
  65.   *ptrCreateInfo=0;
  66.   *ptrSelectInfo=0;
  67.   *ptrUpdateInfo=0;
  68.   *ptrDeleteInfo = 0;
  69.  return INSERT;
  70.      break;
  71.      case DELETE:
  72.   *ptrDeleteInfo = CommandInput.CH_Delete();
  73.   *ptrCreateInfo=0;
  74.   *ptrSelectInfo=0;
  75.   *ptrInsertInfo=0;
  76.   *ptrUpdateInfo=0; 
  77.  return DELETE;
  78.      break;
  79.      
  80.      case USE:                    //<---选择数据库
  81.   *ptrDeleteInfo = 0;
  82.   *ptrCreateInfo=0;
  83.   *ptrSelectInfo=0;
  84.   *ptrInsertInfo=0;
  85.   *ptrUpdateInfo=0;
  86.   CommandInput.ChoseDatabase();
  87.  return USE;
  88.      break;
  89.      case DROP:
  90.   *ptrCreateInfo=0;
  91.   *ptrSelectInfo=0;
  92.   *ptrInsertInfo=0;
  93.   *ptrUpdateInfo=0;
  94.   *ptrDeleteInfo = 0;
  95.       CommandInput.DropTB();
  96.  return DROP;
  97.      break;
  98.      case DROPDB:
  99.   *ptrCreateInfo=0;
  100.   *ptrSelectInfo=0;
  101.   *ptrInsertInfo=0;
  102.   *ptrUpdateInfo=0;
  103.   *ptrDeleteInfo = 0;
  104.       CommandInput.DropDB();
  105.  return DROPDB;
  106.      break;
  107.  case NEW:
  108.   *ptrCreateInfo=0;
  109.   *ptrSelectInfo=0;
  110.   *ptrInsertInfo=0;
  111.   *ptrUpdateInfo=0;
  112.   *ptrDeleteInfo = 0;
  113.       CommandInput.NewDB();
  114.  return NEW;
  115.      break;
  116.      case QUIT:           
  117.   CommandInput.PassCommon(";");
  118.   *ptrCreateInfo=0;
  119.   *ptrSelectInfo=0;
  120.   *ptrInsertInfo=0;
  121.   *ptrUpdateInfo=0;
  122.   *ptrDeleteInfo = 0;
  123.   QuitSQL();
  124.  return QUIT;
  125.      break;
  126.  case SHOWDB:
  127.   *ptrCreateInfo=0;
  128.   *ptrSelectInfo=0;
  129.   *ptrInsertInfo=0;
  130.   *ptrUpdateInfo=0;
  131.   *ptrDeleteInfo = 0;         
  132.   ShowDB();
  133.  break;
  134.  case SHOWTABLE:
  135.   *ptrCreateInfo=0;
  136.   *ptrSelectInfo=0;
  137.   *ptrInsertInfo=0;
  138.   *ptrUpdateInfo=0;
  139.   *ptrDeleteInfo = 0;
  140.   
  141.   if(CompStrEver(CurDB,""))
  142.  GnlTrwErr(NODBUSED);
  143.   ShowTable();
  144.  break;
  145.  case HELP:                   
  146.   CommandInput.PassCommon(";");
  147.   *ptrCreateInfo=0;
  148.   *ptrSelectInfo=0;
  149.   *ptrInsertInfo=0;
  150.   *ptrUpdateInfo=0;
  151.   *ptrDeleteInfo = 0;          
  152.   ShowHelp();
  153.  break;
  154.      default :
  155.   *ptrCreateInfo=0;
  156.   *ptrSelectInfo=0;
  157.   *ptrInsertInfo=0;
  158.   *ptrUpdateInfo=0;
  159.   *ptrDeleteInfo = 0;
  160.      break;
  161.      }
  162. }
  163. catch(ErrInfo a)
  164.     //字串输入错误,给出提示--->
  165. {
  166. std::cout<<"The Error near '"<<a.pErrStr<<"'"<<"in Line "<<a.iLineNo<<" may be: n";
  167. std::cout<< ppErr[a.iErrType]<<'n';
  168.     CmdType = UNORMAL;
  169. }
  170. catch(GnlErrInfo a)
  171.     //一般性错误--->
  172. {
  173. std::cout<< ppGnlErr[a.iErrType]<<'n';
  174. std::cout<< "Please type 'help' to get help!n";
  175.   CmdType = UNORMAL;
  176. }
  177.  
  178.    return CmdType;
  179.  }
  180. //构造函数,对输入进行处理,产生一个有以字串的集合--->
  181. Ch_csVstrBlk::Ch_csVstrBlk()
  182.   InitialVar();         //<---初始化输入字串
  183.   MakeVstrBlkList();    //<---生成有意字串块的链表
  184. }
  185. void Ch_csVstrBlk::InitialVar()
  186. {
  187.   //初始化某些参数--->
  188.   StrHead = 0;
  189.   StrNow  = 0;
  190.   StrTail = 0;
  191.   iNumNowInVstr = 0;
  192.   iLineNum[0][0] = 0;
  193.   sta_i = 0;
  194.   strInputCharList = InitialInput();
  195. }
  196. //对输入进行处理,产生一个有意字串的集合--->
  197. void Ch_csVstrBlk::MakeVstrBlkList()
  198. {
  199.   int flag;
  200.   int iForLineNum = 0;
  201.   char* tempStr;
  202.   VSTR_BLK_PTR vbNewBlk;
  203.   do
  204.   {
  205.     flag = InString(&tempStr);
  206.     //<---可能在字符串拷贝时会出错,小心
  207.     if(flag == 0)
  208.     { 
  209.         //<---返回有意字串
  210.         iNumNowInVstr++;
  211.         //<---有意字串个数加1
  212.         {vbNewBlk = new VSTR_BLK;
  213.         vbNewBlk->str = tempStr;
  214.         vbNewBlk->next = 0;
  215.         if(StrHead == 0)
  216.           StrHead = vbNewBlk;
  217.         else
  218. StrTail->next = vbNewBlk;
  219.         StrTail = vbNewBlk;
  220.         }
  221.         //<---生成一个有意字串的结构体,并将它链成链表
  222.     }
  223.     else
  224.     {   //<--- 回车,说明行数加一
  225.         iLineNum[iForLineNum++][1] = iNumNowInVstr;
  226.         //<--- 原来末行的末地址
  227.         iLineNum[iForLineNum][0] = iNumNowInVstr + 1;
  228.         //<--- 新行的首地址
  229.     }
  230.   }
  231.   while(CompStrEver(tempStr,"xff") != 1);
  232.     //<--- 得到的是"xff"时,表示用户输入已经结束
  233.   
  234.   iNumNowInVstr = 0;
  235.   //<--- 再次初始化iNumNowInVstr,用于正式输入处理时的位置计算
  236.   StrNow = StrHead;
  237.   //<--- 将StrNow指到StrHead上
  238. }
  239. bool Ch_csVstrBlk::InString(char** ObjectStr)
  240. {
  241.   int i = 0;
  242.    
  243.   char chTemp;
  244.   *ObjectStr = new char[NAMEMAXLEN];
  245.   if((chTemp = strInputCharList[sta_i++]) != '')
  246.     (*ObjectStr)[i++] = chTemp;
  247.   //<--- 第一个字符如果为空,则必须略过
  248.   do{
  249.   chTemp = strInputCharList[sta_i++];
  250.   (*ObjectStr)[i++] = chTemp;
  251.   }
  252.   while(chTemp != '');
  253.   if(CompStrEver(*ObjectStr, "n"))
  254.     return 1;//<--- 回车
  255.   else
  256.     return 0;//<--- 有意字串
  257. }
  258. char* Ch_csVstrBlk::InitialInput()
  259. {  
  260. //保留有效信息,只留下回车和其他字符,用'xff'来表示字串的结束
  261.   char* strResult;
  262.   strResult = new char[INPUTMAX];
  263.   char tempIn;
  264.   int i = 0;
  265.   int DoGetcharFlag = 1;
  266.   int MaybeEnd = 0;
  267.   int EndFlag = 0;
  268.   do{
  269.      if(DoGetcharFlag)
  270.       {
  271.  tempIn = getchar();
  272.       }
  273.     else
  274.     DoGetcharFlag = 1;
  275.     switch(tempIn)
  276.     {
  277.     case ' ' :                    //<--- 过滤空格
  278.         {
  279.     if(strResult[i - 1] != 0)
  280. strResult[i++] = 0;
  281.         do{
  282.            tempIn = getchar();  
  283.           }while(tempIn == ' ');  //<--- 过滤空格
  284.          DoGetcharFlag = 0;       //<--- 则新的循环中无需再读入一个字符
  285.         }
  286.     break;
  287.        
  288.     case ';' :                    //<--- 输入结束标志
  289.          SaveKeyChar(strResult,&i,tempIn);
  290.          MaybeEnd = 1;            //<--- 表示可能是输入结束,MaybeEnd在下一次输入回车时会用到
  291.     break;
  292.     case ',' :
  293.     case '(' :
  294.     case ')' :
  295.     case '>' :
  296.     case '<' :
  297.     case '=' :
  298.          SaveKeyChar(strResult,&i,tempIn);
  299.     break;
  300.     case ''' :                   //<--- 在回车之前必须得到另外一个 ' 以作匹配
  301.      strResult[i++] = tempIn;
  302.          while( (tempIn = getchar())!='n' &&tempIn != ','&&tempIn!= '''&&tempIn!= ';')
  303.            strResult[i++] = tempIn;
  304.          if(tempIn == ''')
  305.         {strResult[i++] = tempIn;
  306.            strResult[i++] = '';}
  307.          else{
  308.            do{tempIn=getchar();}while(tempIn !='n');
  309.                 GnlTrwErr(WITHOUTMATCH);//<---  单引号不匹配
  310.          }
  311.     break;
  312.     case 'n' :
  313.          if(MaybeEnd == 0)
  314.  {
  315.           // 回车后将呈现的提示符 --->
  316.       std::cout<<"       ->";
  317.           SaveKeyChar(strResult,&i,tempIn);
  318.  }
  319.          else                       //<--- 这一次是整个命令的正式结束
  320.  {SaveKeyChar(strResult,&i,tempIn);
  321.  EndFlag = 1;}
  322.     break;
  323.     default :                       //<--- 一般的字符输入
  324.          strResult[i++] = tempIn;
  325.     break;
  326.     } 
  327.   }
  328.   while(EndFlag == 0 && i < INPUTMAX);//<--- 检查何种原因退出循环
  329.   SaveKeyChar(strResult,&i,'xff');
  330.   strResult[i] = '';
  331.   return strResult;
  332. }
  333. TB_Create_Info* Ch_csVstrBlk::CH_Create()
  334.  //表示一个完整的有关Create操作的参数类,负责Create命令的所有操作
  335. {
  336.   // 命令输入应该如:create table tablename(columnname,type);
  337.   char* strTableName = 0;
  338.   TB_Create_Info* tbReturn;
  339.   pCreate_Column pTemp = 0,pHead = 0,pTail = 0;
  340.   int iColNum = 0;
  341.   bool NotEnd = 1;
  342.   bool bPriKeyExist = 0;                    //<--- 用于判断Primary key是否存在的标志
  343.   PassCommon("table");
  344.   strTableName = GetTBName();               //<--- 取得表名
  345.   if(CheckTB(strTableName))
  346. GnlTrwErr(SUCHTBEXIST);             //<--- 检验输入的该table是否存在,存在则给出错误
  347.   SetCurRelation(strTableName);
  348.   PassCommon("(");
  349.   do                                        //<--- 取得各个列定义的名称和类型
  350.   {
  351.    if(CompStrEver(StrNow->str,"check"))
  352.      GetCheckInfo(&NotEnd,pHead);           //<--- 该行是有关列的约束信息
  353.    else
  354.    {pTemp = GetColumnInfo(&NotEnd,bPriKeyExist);
  355.    iColNum++;                               //<--- 列的数量+1
  356.    if(pHead == 0)
  357.     {pHead = pTemp;
  358.      pTail = pTemp;
  359.     }
  360.    else{
  361.  pTail->next = pTemp;
  362.  pTail = pTemp;}
  363.    }
  364.   }while(NotEnd);
  365.   PassCommon(")");
  366.   PassCommon(";");
  367.   if(bPriKeyExist == 0)                     //<--- primary key不存在
  368.     GnlTrwErr(NOPRIMARYKEY);
  369.   tbReturn = new TB_Create_Info(iColNum,pHead,strTableName);
  370.   //<--- 生成该表
  371.   return tbReturn;
  372. }
  373. void Ch_csVstrBlk::GetCheckInfo(bool *NotEnd,pCreate_Column pHead)
  374. //功能描述:得到有关一个列的约束信息
  375. char* strColName = new char[NAMEMAXLEN];
  376. EOPE_TYPE optype;
  377. ECOL_TYPE coltype;
  378. COLVAL tmin;
  379. COLVAL tmax;
  380. pCreate_Column pColtemp = 0;
  381. PassCommon("check");
  382. PassCommon("(");
  383. pColtemp = GetColForCheck(StrNow->str,pHead);         //<--- 得到check中列的各个信息
  384. optype = GetOptype();                                 //<--- 得到所要check的列的操作类型
  385. coltype = pColtemp->ColType;                          //<--- 赋所要check的列的数据类型(char,int,float)中的一种
  386. if(optype == BETWEEN)                                 //<--- BETWEEN AND 比较特殊,单独处理
  387.   {PassCommon("between");
  388.    switch(coltype)                                    //<--- 根据数据类型给约束条件赋值
  389.     {
  390.      case I:
  391.         tmin.IntValue = atoi(StrNow->str);
  392.         NextStr();
  393.         PassCommon("and");
  394.         tmax.IntValue = atoi(StrNow->str);
  395.         NextStr();
  396.         pColtemp->SetColValint(optype,tmin.IntValue,tmax.IntValue);
  397.        break;
  398.      
  399.      case F:
  400.         tmin.FloatValue = atof(StrNow->str);
  401.         NextStr();
  402.         PassCommon("and");
  403.         tmax.FloatValue = atof(StrNow->str);
  404.         NextStr();
  405.         pColtemp->SetColValfloat(optype,tmin.FloatValue,tmax.FloatValue);
  406.        break;
  407.      case C:
  408.         tmin.pCharValue = FilterQuota(StrNow->str);
  409.         NextStr();
  410.         PassCommon("and");
  411.         tmax.pCharValue = FilterQuota(StrNow->str);
  412.         pColtemp->SetColValstr(optype,tmin.pCharValue,tmax.pCharValue);
  413.        break;
  414.     }
  415.    }
  416. else                                                  //<--- 非Between的操作类型,就可以直接设置
  417.   {SetMin_Max(tmin,tmax,optype,coltype);
  418.   pColtemp->SetColVal(optype,tmin,tmax);
  419.   }                                                   //<--- 善后工作
  420. PassCommon(")");
  421. if(CompStrEver(StrNow->str,","))
  422.   NextStr();
  423. else
  424.   if(CompStrEver(StrNow->str,")"))
  425.     *NotEnd = 0;
  426. }
  427. EOPE_TYPE Ch_csVstrBlk::GetOptype()
  428. {
  429. //功能描述:得到一个列的操作类型
  430.  
  431. VSTR_BLK_PTR StrTemp = StrNow;
  432. EOPE_TYPE ret;
  433. if(CompStrEver(StrNow->str,"between"))
  434.   ret = BETWEEN;
  435. else
  436.   if(CompStrEver(StrNow->str,"="))
  437.  {
  438.   NextStr();
  439.   ret = E;}
  440.     else
  441.       if(CompStrEver(StrNow->str,"!"))
  442.        {NextStr();
  443.         PassCommon("=");
  444.         ret = NE;
  445.        }
  446.         else
  447.           if(CompStrEver(StrNow->str,">"))
  448.            {NextStr();
  449.               if(CompStrEver(StrNow->str,"="))
  450.   {NextStr();
  451.   ret = BE;}
  452.               else 
  453.                 ret = B;
  454.             }
  455.           else
  456.             if(CompStrEver(StrNow->str,"<"))
  457.              {NextStr();
  458.               if(CompStrEver(StrNow->str,"="))                  //<--- 但是<时还要判断后面有没有=
  459.   {
  460.  NextStr();
  461.      ret = LE;}
  462.               else 
  463.                 ret = L;
  464.               }
  465.             else
  466.               ThrowStrErr(GET_OP_ERR,iNumNowInVstr);
  467.     return ret;
  468. }
  469. pCreate_Column Ch_csVstrBlk::GetColForCheck(char* str,pCreate_Column pHead)
  470. {
  471. // 已知check中的列名,在前面已经只好的pHead列表中寻找该列的各个相关信息
  472. pCreate_Column pCol = pHead,pTemp;
  473. bool bNotFind = 1;
  474. for(;pCol != 0 && bNotFind; pCol = pCol->next)
  475.   {bNotFind = !(CompStrEver(pCol->ColumnName,str));
  476. pTemp = pCol;
  477.   }                                         //<--- 在列链表中搜索所要找的列名
  478. NextStr();
  479. if(bNotFind)
  480.   ThrowStrErr(COLNAMEERR_IN_CHECK,iNumNowInVstr);//<--- check的列名实际上并不存在
  481. return pTemp;
  482. }
  483. pCreate_Column Ch_csVstrBlk::GetColumnInfo(bool* NotEnd,bool& bPriKeyExist)
  484. {
  485.   char strColName[NAMEMAXLEN];
  486.   bool bError = 0,isnulltemp = 0,ispritemp = 0,ColNotEnd = 1;
  487.   VSTR_BLK_PTR StrTemp = 0;
  488.   pCreate_Column csOneCol = 0;
  489.   ECOL_TYPE coltypetemp;
  490.   int iStrlen = 0;
  491.   strcpy(strColName,StrNow->str);           //<--- 得到一列的列名信息
  492.   NextStr();
  493.   if(CompStrEver(StrNow->str,"char"))
  494.     {                                       //<--- 针对字段类型是char
  495.  coltypetemp = C;
  496.  NextStr();
  497.      PassCommon("(");
  498.  if(CompStrEver(StrNow->str,")"))
  499. iStrlen = 0;
  500.      else
  501.  {iStrlen = atoi(StrNow->str);
  502.  NextStr();}                            //<--- 如将har(8)中的8取得
  503.      PassCommon(")");
  504.     }
  505.   else
  506.     if(CompStrEver(StrNow->str,"int"))
  507.      {                                      //<--- 针对字段类型是int
  508.       coltypetemp = I;
  509.   NextStr();
  510.      }
  511.     else
  512.       if(CompStrEver(StrNow->str,"float"))
  513.         {                                   //<--- 针对字段类型是float
  514.          coltypetemp = F;
  515.  NextStr();
  516.         }
  517.       else
  518.        bError = 1;
  519.   if(bError == 1)
  520.     ThrowStrErr(COLUMNTYPE,iNumNowInVstr);
  521.   do
  522.   {
  523.    if(CompStrEver(StrNow->str,"notnull"))   //<--- 有关一个列的定义之后如带有notnull或primary则记录下信息
  524.     {isnulltemp = 0;
  525.       NextStr();}
  526.    else
  527.      if(CompStrEver(StrNow->str,"primary"))
  528.     {ispritemp = 1;
  529.      bPriKeyExist = 1;                      //<--- primary key exists
  530.       NextStr();}
  531.      else
  532.        if(CompStrEver(StrNow->str,","))
  533.     {
  534.      ColNotEnd = 0;
  535.      NextStr();
  536.     }
  537.        else
  538.          if(CompStrEver(StrNow->str,")"))
  539.           {ColNotEnd = 0;
  540.            *NotEnd = 0;}
  541.            else 
  542.              ThrowStrErr(KEYWORD,iNumNowInVstr);
  543.   }while(ColNotEnd);
  544.   csOneCol = new Create_Column(strColName,coltypetemp,iStrlen,isnulltemp,ispritemp);
  545.   return csOneCol;
  546. }
  547. void Ch_csVstrBlk::NextStr()
  548. //功能描述:    转到下一个StrNow(即StrNow = StrNow->Next)
  549.   iNumNowInVstr++;
  550.   StrNow = StrNow->next;
  551. }
  552. char* Ch_csVstrBlk::GetTBName()
  553. {                                           //<--- 取得表名
  554.   char* strTBName = new char[NAMEMAXLEN];
  555.   strcpy(strTBName,StrNow->str);
  556.   NextStr();
  557.   return strTBName;
  558. }
  559. void Ch_csVstrBlk::PassCommon(char* pStrIn)
  560.  /*对StrNow当前所指的字串是否和输入的字串一致,一致则iNumNowInVstr++,StrNow = StrNow->next;
  561.  不一致ThrowStrErr(COMMON,iNumNowInVstr);
  562. */ 
  563. {
  564.   if(CompStrEver(pStrIn,StrNow->str))
  565.     NextStr();
  566.   else
  567.     ThrowStrErr(COMMON,iNumNowInVstr);
  568. }
  569. ECMD_TYPE Ch_csVstrBlk::ResolveCmd()
  570.  //功能描述:解析取得命令
  571. {
  572.   ECMD_TYPE ReturnValue = HELP;
  573.   bool bError = 0;
  574. if(CompStrEver(StrNow->str,"HELP"))
  575. {
  576.  ReturnValue = HELP;
  577. }
  578. else
  579.   if(CompStrEver(StrNow->str,"?"))
  580.   {
  581.  ReturnValue = HELP;
  582.   }
  583. else
  584.     if(CompStrEver(StrNow->str,"QUIT"))
  585.     {ReturnValue = QUIT;}
  586.     else
  587.         if(CompStrEver(StrNow->str,"EXIT"))
  588.         {ReturnValue = QUIT;}
  589.         else
  590.             if(CompStrEver(StrNow->str,"DROPDB"))
  591.                 ReturnValue = DROPDB;
  592.             else
  593.                 if(CompStrEver(StrNow->str,"SHOWDB"))
  594.                  ReturnValue = SHOWDB;
  595.                 else
  596.                     if(CompStrEver(StrNow->str,"USE"))
  597.                         ReturnValue = USE;
  598.                     else
  599.                         if(CompStrEver(StrNow->str,"NEW"))
  600.                             ReturnValue = NEW;
  601.                          else
  602.                             if(CompStrEver(StrNow->str,"DROP"))
  603.                                 ReturnValue = DROP;
  604.                             else
  605.                                 {
  606.                                 if(CompStrEver(StrNow->str,"CREATE"))
  607.                                     ReturnValue = CREATE;
  608.                                   else
  609.                                     if(CompStrEver(StrNow->str,"SELECT"))
  610.                                       ReturnValue = SELECT;
  611.                                     else
  612.                                       if(CompStrEver(StrNow->str,"INSERT"))
  613.                                         ReturnValue = INSERT;
  614.                                       else
  615.                                         if(CompStrEver(StrNow->str,"UPDATE"))
  616.                                           ReturnValue = UPDATE;
  617.                                         else
  618.                                           if(CompStrEver(StrNow->str,"DELETE"))
  619.                                             ReturnValue = DELETE;
  620.                                           else
  621.                                                 if(CompStrEver(StrNow->str,"SHOWTABLE"))
  622.                                                   ReturnValue = SHOWTABLE;
  623.                                                 else
  624.                                                     bError = 1;}
  625.  
  626.    if(bError == 1)
  627.     ThrowStrErr(RESOLVE,iNumNowInVstr);
  628.   else
  629.     NextStr();                              //<--- 第一个有意字串不出错,则iNumNowInVstr+1
  630.   return ReturnValue;
  631. }
  632.  void Ch_csVstrBlk::ThrowStrErr(int type,int iNum)
  633. {                                           //<--- 负责构造一个错误类并将它抛出来,由主函数来处理
  634.   ErrInfo eiTemp;
  635.   int iLine = 0;
  636.   int i = 0;
  637.   char* str = new char[NAMEMAXLEN];
  638.   VSTR_BLK_PTR StrTemp = StrHead;
  639.   for(;iNum > iLineNum[iLine][1];iLine++)
  640.   ;
  641.    i = iNum;                               //<--- 查找出错在那一行
  642.   for(; i != 0;i--)
  643.   StrTemp = StrTemp->next;             //<--- 查找出错在哪个有意字串
  644.   eiTemp.iErrType = type;
  645.   eiTemp.iLineNo = iLine;
  646.   strcpy(str,StrTemp->str);
  647.   eiTemp.pErrStr = str;
  648.   throw(eiTemp);
  649. }
  650. //<--- 设置好列中的Min&Max约束
  651. void Ch_csVstrBlk::SetMin_Max(COLVAL temp,COLVAL& min,COLVAL& max,EOPE_TYPE optype,ECOL_TYPE coltype)
  652.  {
  653.  switch(optype)
  654.   {
  655.   case E:
  656.   case NE:
  657.     switch(coltype)
  658.     {case I:
  659.         min = temp;
  660.         max = min;
  661.         break;
  662.       case F:
  663. min = temp;
  664.         max = min;
  665.         break;
  666.       case C:
  667.         min = temp;
  668.         max = min;
  669. break;
  670.     }
  671.   case LE:
  672.   case L:
  673.     switch(coltype)
  674.     {case I:
  675.         max = temp;
  676.         break;
  677.       case F:
  678.         max = temp;
  679.         
  680.         break;
  681.       case C:
  682.         max.pCharValue = FilterQuota(temp.pCharValue);
  683.         
  684.         break;
  685.     } 
  686.   case B:
  687.   case BE:
  688.     switch(coltype)
  689.     {case I:
  690.         min = temp;
  691.         
  692.         break;
  693.       case F:
  694.         min = temp;
  695.         
  696.         break;
  697.       case C:
  698.         min.pCharValue = FilterQuota(temp.pCharValue);
  699.         
  700.         break;
  701.         }
  702.     
  703.   }
  704.  }
  705.  void Ch_csVstrBlk::SetMin_Max(COLVAL& min,COLVAL& max,EOPE_TYPE optype,ECOL_TYPE coltype,bool next)
  706. {
  707. //根据optype给min和max赋值,当前StrNow必须处在处理的有意字串上
  708.  
  709. switch(optype)
  710.   {
  711.   case E:
  712.   case NE:
  713.     switch(coltype)
  714.     {case I:
  715.         min.IntValue = atoi(StrNow->str);
  716.         max.IntValue = min.IntValue;
  717.         break;
  718.       case F:
  719.         min.FloatValue = atof(StrNow->str);
  720.         max.FloatValue = min.FloatValue;
  721.         break;
  722.       case C:
  723.         min.pCharValue = FilterQuota(StrNow->str);
  724.         max.pCharValue = min.pCharValue;
  725.         break;
  726.     }
  727.   case LE:
  728.   case L:
  729.     switch(coltype)
  730.     {case I:
  731.         max.IntValue = atoi(StrNow->str);
  732.         break;
  733.       case F:
  734.         max.FloatValue = atof(StrNow->str);
  735.         
  736.         break;
  737.       case C:
  738.         max.pCharValue = FilterQuota(StrNow->str);
  739.         
  740.         break;
  741.     }
  742.     
  743.   case B:
  744.   case BE:
  745.     switch(coltype)
  746.     {case I:
  747.         min.IntValue = atoi(StrNow->str);
  748.         
  749.         break;
  750.       case F:
  751.         min.FloatValue = atof(StrNow->str);
  752.         
  753.         break;
  754.       case C:
  755.         min.pCharValue = FilterQuota(StrNow->str);
  756.         
  757.         break;
  758.         }
  759.     
  760.   }
  761. if(next)
  762. NextStr();
  763. }
  764.  //结构体TB_Create_Info
  765.  TB_Create_Info::TB_Create_Info(int i,pCreate_Column p,char* str):TotalColumn(i),head(p)
  766.  {
  767.     strcpy(TableName,str);
  768.  }
  769.  //结构体Create_Column
  770. Create_Column::Create_Column(char* str,ECOL_TYPE coltype,int strlen,bool is_null,bool ispri):
  771.     ColType(coltype),length(strlen),IsNull(is_null),isprimary(ispri),next(0)
  772. {
  773.   strcpy(ColumnName,str);
  774.   switch(coltype)
  775.   {case C ://<--- 即该列为字符
  776.     min.pCharValue = new char[2];
  777.     strcpy(min.pCharValue,"z");
  778.     max.pCharValue = new char[2];
  779.     strcpy(max.pCharValue,"a");
  780.    break;
  781.    case F ://<--- 即该列为浮点数
  782.     min.FloatValue = 1.0;
  783.     max.FloatValue = 0;
  784.    break;
  785.    case I ://<--- 即该列为整数
  786.      min.IntValue = 1;
  787.      max.IntValue = -1;
  788.    break;
  789.    default :
  790.    break;
  791.   }
  792. }
  793. void Create_Column::SetColVal(EOPE_TYPE optype,COLVAL &tMin ,COLVAL &tMax)
  794. {
  795.   OperType = optype;
  796.   min = tMin;
  797.   max = tMax;
  798. }
  799. void Create_Column::SetColValstr(EOPE_TYPE optype,char* chMin = 0,char* chMax = 0)
  800. {
  801. //初始化min.pCharValue,max.pCharValue
  802.   int iStrLen = length;
  803.   OperType = optype;
  804.   if(chMin != 0)                            //<--- 如果min.pCharValue和max.pCharValue有范围限制
  805.   {delete min.pCharValue;
  806.   delete max.pCharValue;
  807.   if(length == 0)
  808.   iStrLen = NAMEMAXLEN;
  809.   min.pCharValue = new char[iStrLen];
  810.   max.pCharValue = new char[iStrLen];
  811.   strcpy(min.pCharValue,chMin);
  812.   strcpy(max.pCharValue,chMax);
  813.   }
  814. }
  815. void Create_Column::SetColValint(EOPE_TYPE optype,int iMin,int iMax)
  816. {
  817. //初始化min.IntValue,max.IntValue
  818.   min.IntValue = iMin;
  819.   max.IntValue = iMax;
  820.   OperType = optype;
  821. }
  822. void Create_Column::SetColValfloat(EOPE_TYPE optype,float fMin,float fMax)
  823. {
  824. // 初始化min.FloatValue,max.FloatValue初始一下
  825.   OperType = optype;
  826.   min.FloatValue = fMin;
  827.   max.FloatValue = fMax;
  828. }
  829. //表示一个完整的有关Insert操作的参数类,负责Insert命令的所有操作
  830. TB_Insert_Info* Ch_csVstrBlk::CH_Insert()
  831. {
  832.   char* strTableName = 0; //<--- 所要插入的表名
  833.   TB_Insert_Info* tbReturn = 0;
  834.   pIns_Col pHead = 0;
  835.   int iValNum = 0; //<--- 链表长度
  836.   //<--- 取得insert插入值列表
  837.   PassCommon("into");
  838.   strTableName = GetTBName();           //<--- 取得表名
  839.   if(!CheckTB(strTableName))
  840. GnlTrwErr(NOSUCHTB);            //<--- 检验输入的该table是否存在
  841.   SetCurRelation(strTableName);         //<--- 保存表名
  842.   PassCommon("values");
  843.   PassCommon("(");
  844.   pHead = GetInsValList(iValNum);       //<--- 取得插入值序列
  845.   PassCommon(")");
  846.   PassCommon(";");
  847.   tbReturn = new TB_Insert_Info(strTableName,pHead,iValNum);
  848.   return tbReturn;
  849. }
  850. pIns_Col Ch_csVstrBlk::GetInsValList(int& iValNum)
  851. {
  852.     pIns_Col pHead = 0,pTail,pTemp = 0;
  853. Column_Type ColType; //<--- 此字段的类型
  854. COLVAL value;
  855. int FirstTime = 1;
  856. do{
  857. iValNum++;
  858. if(!FirstTime)                              //<--- 不是第一个值
  859.   PassCommon(",");                          //<--- 各值以" , "相隔
  860. else 
  861. FirstTime = 0;
  862. SetColValFStr(ColType,value);
  863. pTemp = new Ins_Col("*",ColType,value);     //<--- 设置好各个列值
  864.     if(pHead == 0)
  865.     {pHead = pTemp;
  866.      pTail = pTemp;
  867.     }
  868.    else{
  869.  pTail->next = pTemp;
  870.  pTail = pTemp;}
  871. }
  872. while(CompStrEver(StrNow->str,","));
  873. return pHead;
  874. }
  875. //表示一个完整的有关Select操作的参数类,负责Select命令的所有操作
  876. TB_Select_Info* Ch_csVstrBlk::CH_Select()
  877. {
  878.   char* strTableName = 0;
  879.   TB_Select_Info* tbReturn = 0;
  880.   pSel_Col pSel_ColHead = 0;
  881.   pSel_Cond pCond_Head = 0;
  882.   int iColNum = 0;
  883.   int iCondNum = 0;
  884.   bool NotEnd = 1;
  885.   if(CompStrEver(StrNow->str,"from"))
  886.     ThrowStrErr(NOCOL,iNumNowInVstr);
  887.   else
  888.     pSel_ColHead = GetSelColList(iColNum);
  889.   //<--- 取得select 列名列表
  890.   PassCommon("from");
  891.   strTableName = GetTBName();
  892.   //<--- 得到表名
  893.   if(!CheckTB(strTableName))
  894. GnlTrwErr(NOSUCHTB);           //<--- 检验输入的该table是否存在
  895.   SetCurRelation(strTableName);        //<--- 保存表名
  896.   if(CompStrEver(StrNow->str,";"))
  897.     {iCondNum = 0;pCond_Head = 0;}
  898.   else
  899.     {PassCommon("where");
  900.     pCond_Head = GetCondList(iCondNum);} //<--- 得到条件链表
  901.   tbReturn = new TB_Select_Info(strTableName,iColNum,pSel_ColHead,iCondNum,pCond_Head);
  902.   return tbReturn;
  903. }
  904. //功能描述:得到select,update,delete,insert中有关条件的描述信息的列表--->
  905. pSel_Cond  Ch_csVstrBlk::GetCondList(int& iCondNum)
  906. {
  907. pSel_Cond pHead = 0,pTail,pTemp = 0;
  908. int FirstTime = 1;
  909.     char PriKey[NAMEMAXLEN];         //<--- 主键名
  910. COLVAL         tmax;             //<--- 上限
  911. COLVAL         tmin;             //<--- 下限
  912. COLVAL              tColVal;
  913. Column_Type tColType;
  914. Operator_Type tOperType;             //<--- 关系运算符
  915. do{
  916. iCondNum++;
  917. if(!FirstTime)
  918.   PassCommon("and");
  919. else 
  920. FirstTime = 0;
  921. strcpy(PriKey,StrNow->str);
  922. NextStr();                      //<--- 获得第一个条件的列名
  923. tOperType = GetOptype();        //<--- 得到操作类型
  924. if(tOperType == BETWEEN)
  925. {
  926. PassCommon("between");
  927. SetColValFStr(tColType,tmin);
  928. PassCommon("and");
  929.         SetColValFStr(tColType,tmax);
  930.         }
  931.      
  932. else
  933. {SetColValFStr(tColType,tColVal);
  934. SetMin_Max(tColVal,tmin,tmax,tOperType,tColType);}
  935. pTemp = new TSelect_Condition(PriKey,tmin,tmax,tColType,tOperType);
  936.     if(pHead == 0)
  937.     {pHead = pTemp;
  938.      pTail = pTemp;
  939.     }
  940.    else{
  941.  pTail->next = pTemp;
  942.  pTail = pTemp;}
  943. }while(CompStrEver(StrNow->str,"and"));
  944. return pHead;
  945. }
  946. //<--- 功能描述:得到有关一个输入的字串为和类型(I,C,F)及对相应的tColVal赋值
  947. void Ch_csVstrBlk::SetColValFStr(ECOL_TYPE& coltype,COLVAL& tColVal,bool next)
  948. {
  949. int i = 0;
  950. bool NotFind = 1;
  951. char* strTemp = StrNow->str;
  952. if(strTemp[0] == ''')
  953. {strTemp = FilterQuota(StrNow->str);
  954.  coltype = C;
  955.  tColVal.pCharValue = strTemp;
  956. }
  957. else
  958. {
  959. for(i = 0;strTemp[i] !='' && NotFind;i++)
  960. if(strTemp[i] == '.')           //<--- 存在点号,则说明是float
  961. NotFind = 0;
  962. if(NotFind == 0)
  963. {
  964. tColVal.FloatValue = atof(StrNow->str);
  965. coltype = F;
  966. }
  967. else
  968. {
  969. tColVal.IntValue = atoi(StrNow->str);
  970. coltype = I;
  971. }
  972. }
  973. if(next)
  974. NextStr();                          //<--- 转到下一个条件上
  975. }
  976. //<--- 功能描述:得到select中关于字段(列名)的列表
  977. pSel_Col Ch_csVstrBlk::GetSelColList(int& i)
  978. {
  979. pSel_Col pHead = 0,pTail,pTemp = 0;
  980. pHead = new Sel_Col(StrNow->str);
  981. pTail = pHead;                          //<--- 得到第一个列名
  982. i++;
  983. NextStr();
  984. while(!CompStrEver(StrNow->str,"from")) //<--- 当不是from(应该是" , ")时,说明还有列名
  985. {
  986. PassCommon(",");
  987. pTemp = new Sel_Col(StrNow->str);
  988. NextStr();
  989.    pTail->next = pTemp;
  990. pTail = pTemp;
  991. i++;                                //<--- 计算列名的数量
  992. }
  993. return pHead;
  994. }
  995. //表示一个完整的有关Update操作的参数类,负责Update命令的所有操作
  996. TB_Update_Info* Ch_csVstrBlk::CH_Update()
  997. {
  998.   char* strTableName = 0;                //<--- 要执行修改的表名
  999.   Update_Column* pUpd_ColHead = 0;  //<--- 所要修改的字段及其值的链表
  1000.   pConds  pCond_Head = 0;                //<--- 修改的范围的查询条件链表
  1001.   int iColNum = 0;            //<--- 字段数
  1002.   int iCondNum = 0;            //<--- 条件数
  1003.   TB_Update_Info* tbReturn = 0;
  1004.   strTableName = GetTBName();              //<--- 得到表名
  1005.   if(!CheckTB(strTableName))
  1006. GnlTrwErr(NOSUCHTB);               //<--- 检验输入的该table是否存在
  1007.   SetCurRelation(strTableName);            //<--- 保存表名
  1008.   PassCommon("set");                       //<--- 过滤set,进入取得列名链表阶段
  1009.   pUpd_ColHead = GetUpdColList(iColNum);
  1010.   PassCommon("where");
  1011.   pCond_Head = GetCondList(iCondNum);      //<--- 得到条件链表
  1012.   tbReturn = new TB_Update_Info(strTableName,pUpd_ColHead,iColNum,pCond_Head,iCondNum);
  1013.  
  1014.   return tbReturn;
  1015. }
  1016. pUpd_Col Ch_csVstrBlk::GetUpdColList(int &iColNum)
  1017. //<--- 得到update中要重新设值的列名
  1018. { pUpd_Col pHead = 0,pTail = 0,pTemp = 0;
  1019. char ColName[NAMEMAXLEN];   //<--- 字段名
  1020. Column_Type ColType;           //<--- 此字段的类型
  1021. COLVAL value;
  1022. int FirstTime = 1;
  1023. do{
  1024. iColNum++;
  1025. if(!FirstTime)
  1026.   PassCommon(",");
  1027. else 
  1028. FirstTime = 0;
  1029. strcpy(ColName,StrNow->str);
  1030. NextStr();
  1031. PassCommon("=");
  1032.     SetColValFStr(ColType,value);                     //<--- 对该字段的新值和列的值类型赋值
  1033. pTemp = new TUpdate_Column(ColName,ColType,value);//<--- 生成该字段
  1034.     if(pHead == 0)
  1035.     {pHead = pTemp;
  1036.      pTail = pTemp;
  1037.     }
  1038.    else{
  1039.  pTail->next = pTemp;
  1040.  pTail = pTemp;}                                  //<--- 链到链表中
  1041. }while(CompStrEver(StrNow->str,","));             //<--- 如果以','结尾,说明可能是多个列同时更新值
  1042.     return pHead;
  1043. }
  1044. TB_Delete_Info* Ch_csVstrBlk::CH_Delete()
  1045. {  char*    strTableName = 0;     //<--- 要执行修改的表名
  1046.    pConds   pCond_Head = 0; //<--- 所要修改的字段及其值的链表
  1047.    int iCondNum = 0;     //<--- 条件数
  1048.    TB_Delete_Info* tbReturn = 0;
  1049.    PassCommon("from");
  1050.    strTableName = GetTBName();      //<--- 取得表名
  1051.    if(!CheckTB(strTableName))
  1052. GnlTrwErr(NOSUCHTB);        //<--- 检验输入的该table是否存在
  1053.    SetCurRelation(strTableName);    //<--- 保存表名
  1054.    PassCommon("where");
  1055.    pCond_Head = GetCondList(iCondNum);//<--- 得到条件列表
  1056.    tbReturn = new TB_Delete_Info(strTableName,pCond_Head,iCondNum);
  1057.    return tbReturn;
  1058. }
  1059. void Ch_csVstrBlk::ChoseDatabase()
  1060. {
  1061. if(CompStrEver(StrNow->str,";"))
  1062. ThrowStrErr(COMMON,iNumNowInVstr);//<--- 可能漏输database name
  1063. char* dbname = StrNow->str;
  1064. NextStr();
  1065. PassCommon(";");                      //<--- 在database name后不能有其他的输入
  1066. if(!CheckDB(dbname))
  1067. GnlTrwErr(NOSUCHDB);              //<--- 检验输入的该database是否存在
  1068. SetCurLocation(dbname);               //<--- 根据该输入设置好当前路径
  1069. strcpy(CurDB,dbname);                 //<--- 设置好当前的数据库
  1070. ShowTable();
  1071. }
  1072. void Ch_csVstrBlk::DropTB()
  1073. {
  1074.     if(CompStrEver(StrNow->str,";"))
  1075.         ThrowStrErr(COMMON,iNumNowInVstr);//<--- 可能漏输database name
  1076.     if(CompStrEver(CurDB,""))
  1077.     GnlTrwErr(NODBUSED);              //<--- 如果该数据库不存在,则出错
  1078. char* tbname = StrNow->str;
  1079. NextStr();
  1080. PassCommon(";");                      //<--- 在table name后不能有其他的输入
  1081. if(!CheckTB(tbname))
  1082. GnlTrwErr(NOSUCHTB);              //<--- 检验输入的该table是否存在
  1083.     SetCurRelation(tbname);               //<--- 保存表名
  1084. }
  1085.   
  1086. void Ch_csVstrBlk::DropDB()
  1087. {
  1088. if(CompStrEver(StrNow->str,";"))
  1089. ThrowStrErr(COMMON,iNumNowInVstr);//<--- 可能漏输database name
  1090. char* dbname = StrNow->str;
  1091. NextStr();
  1092. PassCommon(";");                      //<--- 在database name后不能有其他的输入
  1093. if(!CheckDB(dbname))
  1094. GnlTrwErr(NOSUCHDB);              //<--- 检验输入的该database是否存在
  1095.     SetCurLocation(dbname);               //<--- 根据该输入设置好当前路径
  1096.     strcpy(CurDB,dbname);                 //<--- 设置好当前的数据库
  1097. }
  1098. // 创建一个数据库--->
  1099. void Ch_csVstrBlk::NewDB()
  1100. {
  1101. if(CompStrEver(StrNow->str,";"))
  1102. ThrowStrErr(COMMON,iNumNowInVstr);            //<--- 可能漏输database name
  1103. char* dbname = StrNow->str;
  1104. NextStr();
  1105. PassCommon(";");                                  //<--- 在database name后不能有其他的输入
  1106. if(CheckDB(dbname))
  1107. GnlTrwErr(SUCHDBEXIST);                       //<--- 检验输入的该database是否存在
  1108. CreateDB(dbname);
  1109. }
  1110.  
  1111. char* FilterQuota(char* strin)
  1112. {
  1113. // 去除字符串中的' '
  1114. char* strTemp = new char[NAMEMAXLEN];
  1115. int i = 0;
  1116. if(strin[0] != ''')
  1117. strcpy(strTemp,strin);
  1118. else
  1119. { for(;strin[i+1]!=''';i++)
  1120. strTemp[i] = strin[i+1];
  1121. strTemp[i] = '';}
  1122. return strTemp;
  1123. }
  1124.  bool CompStrEver(char* str1,char* str2)
  1125. //比较两个字符串是否相等
  1126. {  char a,b;
  1127.    bool IsSame,NotEnd;
  1128.    int i = 0;
  1129.    do{
  1130.       a = ChUpToLowCase(str1[i]);
  1131.       b = ChUpToLowCase(str2[i++]);
  1132.       IsSame = (a==b);
  1133.       NotEnd = (a!='');
  1134.     }while(IsSame&&NotEnd);
  1135.    if (IsSame == 1)
  1136.      return 1;          
  1137.    //<--- IsSame == 1,则说明NotEnd == 0,即比较的结果是str1与str2相等
  1138.    else
  1139.      return 0;
  1140.  }
  1141.  void SaveKeyChar(char* str,int* index,char in)
  1142. /*str 目标字符串数组 
  1143. index 字符所要保存的位置
  1144. in  所要保存的字符
  1145. */
  1146. {
  1147.   if(str[*index-1] != 0)
  1148.     str[(*index)++] = 0;
  1149.   str[(*index)++] = in;
  1150.   str[(*index)++] = 0;
  1151. }
  1152.  // 将一个大写字母换成小写,否则原样返回 --->
  1153.  char ChUpToLowCase(char chIn)
  1154.  {
  1155.    if(chIn >= 'A' && chIn <= 'Z')
  1156.      chIn += 32;
  1157.    return chIn;
  1158.  }
  1159. // 将当前的路径设置好 --->
  1160.  void SetCurLocation(char* str)
  1161.  {
  1162. strcpy(CurLocation,"..\data\");
  1163. strcat(CurLocation,str);
  1164. strcat(CurLocation,"\");
  1165.  }
  1166.  // 将当前的表名设置好 --->
  1167. void SetCurRelation(char* str)
  1168.  {
  1169. strcpy(CurRelationName,str);
  1170.  }
  1171. void ShowHelp()
  1172. {//<--- 帮助提示信息
  1173. std::cout<<"n
  1174.                     Every Command must be ended with ';'n
  1175. help        Display the help informationn
  1176. -----------------------------------------------------------------------------n
  1177. ?           Display the help informationn
  1178. -----------------------------------------------------------------------------n
  1179. create      creat a table in the dbn
  1180.             create table tablename(valuename type notnull);n
  1181. -----------------------------------------------------------------------------n
  1182. select      select a specify column from the tablen
  1183.             select columnname from tablename where check straint;n
  1184. -----------------------------------------------------------------------------n
  1185. delete      delete a specify column from the table n
  1186.             delete columnname from tablename where check straint;n
  1187. -----------------------------------------------------------------------------n
  1188. update      update a table n
  1189.             update tablename set columnname = columnvalue where check straint;n
  1190. -----------------------------------------------------------------------------n
  1191. insert      insert data into the table n
  1192.             insert into tablename(values);n
  1193. -----------------------------------------------------------------------------n
  1194. use         Use a databasen
  1195.             use dbname;n
  1196. -----------------------------------------------------------------------------n
  1197. showdb      Show all the databases n
  1198. -----------------------------------------------------------------------------n
  1199. showtable   Show all the tables in the current db,n
  1200.             so there must have at least one db existn
  1201. -----------------------------------------------------------------------------n
  1202. drop        drop a table n
  1203.             drop tablename;n
  1204. -----------------------------------------------------------------------------n
  1205. dropdb      drop a database n
  1206.             dropdb dbname;n
  1207. -----------------------------------------------------------------------------n
  1208. exit        Quit mysqln
  1209. -----------------------------------------------------------------------------n
  1210. quit        Quit mysqln"<<'n';
  1211. }
  1212. void QuitSQL()
  1213. {
  1214. std::cout<<"BYE BYE!:-)";
  1215. }
  1216. void ShowMsg(char* str)
  1217. {
  1218. std::cout<<str<<'n';
  1219. }
  1220. //<--- Throw the General Errors,一般性错误,如db不存在
  1221. void GnlTrwErr(int ErrType)
  1222. {
  1223. GnlErrInfo eErrTemp;
  1224.     eErrTemp.iErrType = ErrType;
  1225. throw(eErrTemp);
  1226. }