📄 common.cpp
字号:
printf("%s\n",COMMANDLENGTHISNOTENOUGH);
return false;
}
if(!CheckRuleForString(pCommandField[++iIndex].c_str()))
{
printf("此字段名出错,命名不符合规则[%s]\n",pCommandField[iIndex].c_str());
return false;
}
vector<FieldNode>::iterator pData = NULL;
//if(!IsFieldExist(pCommandField[iIndex].c_str(),pFieldList,pData))
// {
// printf("check 中的字段当前不存在\n");
// return false;
// }
for(pData = pFieldList.begin(); pData != pFieldList.end(); pData++)
{
if(strcmp(pData->strFieldName,pCommandField[iIndex].c_str()) == 0)
break;
}
if(strcmp(pData->strFieldName,pCommandField[iIndex].c_str()) != 0)
{
printf("check 中的字段当前不存在\n");
return false;
}
if(iIndex+1 >= pCommandField.size())
{
printf("%s\n",COMMANDLENGTHISNOTENOUGH);
return false;
}
if(!strcmp(pCommandField[++iIndex].c_str(),"between") == 0)
{
printf("在检查的关键字后面需要between\n");
return false;
}
if(iIndex+1 >= pCommandField.size())
{
printf("%s\n",COMMANDLENGTHISNOTENOUGH);
return false;
}
if(CheckRuleForNum(pCommandField[++iIndex].c_str()))
{
pData->lStartValue = atol(pCommandField[iIndex].c_str());
}
if(iIndex+1 >= pCommandField.size())
{
printf("%s\n",COMMANDLENGTHISNOTENOUGH);
return false;
}
if(!strcmp(pCommandField[++iIndex].c_str(),"and") == 0)
{
printf("在检查的关键字后面需要and\n");
return false;
}
if(iIndex+1 >= pCommandField.size())
{
printf("%s\n",COMMANDLENGTHISNOTENOUGH);
return false;
}
if(CheckRuleForNum(pCommandField[++iIndex].c_str()))
{
pData->IEndValue = atol(pCommandField[iIndex].c_str());
}
if(iIndex+1 >= pCommandField.size())
{
printf("%s\n",COMMANDLENGTHISNOTENOUGH);
return false;
}
if(strcmp(pCommandField[++iIndex].c_str(),",") != 0
&& strcmp(pCommandField[iIndex].c_str(),")") != 0)
{
printf("当前缺少结束符(check)\n");
return false;
}
pData->bIsCheck = true;
return iIndex;
}
//格式化字段分析,设计当前的字段列表 直到分析到) 或 ,便完成此工作
//若数据类型为Int,Text,Date类型,则不用指定其长度
int AnalysisField(vector<string> &pCommandField,int iIndex,vector<FieldNode> &pFieldList)
{
FieldNode fieldNode;
if(!CheckRuleForString(pCommandField[iIndex].c_str()))
{
printf("此字段名出错,命名不符合规则[%s]\n",pCommandField[iIndex].c_str());
return false;
}
vector<FieldNode>::iterator pData;
//if(IsFieldExist(pCommandField[iIndex].c_str(),pFieldList,pData))
//{
// printf("当前的字段重名[%s]\n",pData->strFieldName);
// return false;
//}
if(pFieldList.size() > 0)
{
for(pData = pFieldList.begin(); pData != pFieldList.end(); pData++)
{
if(strcmp(pData->strFieldName,pCommandField[iIndex].c_str()) == 0)
break;
}
if(strcmp(pData->strFieldName,pCommandField[iIndex].c_str()) == 0)
{
printf("存在字段重名\n");
return false;
}
}
//赋值字段名
strcpy(fieldNode.strFieldName,pCommandField[iIndex].c_str());
switch(QueryKeyType(pCommandField[++iIndex].c_str()))
{
case VARCHAR_TYPE:
if(iIndex+1 >= pCommandField.size())
{
printf("%s\n",COMMANDLENGTHISNOTENOUGH);
return false;
}
if(QueryKeyType(pCommandField[++iIndex].c_str()) != LEFT_MARK)
{
printf("Varchar后面没有 [(]\n");
return false;
}
if(iIndex+1 >= pCommandField.size())
{
printf("%s\n",COMMANDLENGTHISNOTENOUGH);
return false;
}
if(!CheckRuleForNum(pCommandField[++iIndex].c_str()))
{
printf("当前没有输入正确的数值,检查Varchar\n");
return false;
}
fieldNode.iFieldType = VARCHAR_TYPE;
fieldNode.iValueLength = atoi(pCommandField[iIndex].c_str());
if(iIndex+1 >= pCommandField.size())
{
printf("%s\n",COMMANDLENGTHISNOTENOUGH);
return false;
}
if(QueryKeyType(pCommandField[++iIndex].c_str()) != RIGHT_MARK)
{
printf("数值后面没有 [)]结尾\n");
return false;
}
break;
case INT_TYPE:
fieldNode.iFieldType = INT_TYPE;
break;
case TEXT_TYPE:
fieldNode.iFieldType = TEXT_TYPE;
break;
case DATE_TYPE:
fieldNode.iFieldType = DATE_TYPE;
break;
default:
printf("当前输入的数据类型不合法[%s]\n",pCommandField[iIndex].c_str());
return false;
break;
}
//下面对是否为not null ,Primary关键字进行检查
//若为,或) 则退出
for(int i = 0; i < 3; i++)
{
if(iIndex+1 >= pCommandField.size())
{
printf("%s\n",COMMANDLENGTHISNOTENOUGH);
return false;
}
switch(QueryKeyType(pCommandField[++iIndex].c_str()))
{
case RIGHT_MARK:
case COMMA_MARK:
pFieldList.push_back(fieldNode);
return iIndex;
case NOT_KEY: // 为not null关键字
if(iIndex+1 >= pCommandField.size())
{
printf("%s\n",COMMANDLENGTHISNOTENOUGH);
return false;
}
if(strcmp(pCommandField[++iIndex].c_str(),"null") != 0)
{
printf("当前字段中not后面需要null\n");
return false;
}
fieldNode.bIsAllowNull = false; //不允许为空
break;
case PRIMARY_KEY:
if(IsPrimaryExist(pFieldList))
{
printf("当前已经存在主键\n");
return false;
}
fieldNode.bIsPrimaryKey = true;
break;
default:
printf("解析出未知的字符串[%s]\n",pCommandField[iIndex].c_str());
return false;
}
}
printf("字段后面需要一个结束符,请检查\n");
return false;
}
//创建一张表,进行SQL语句解析,将SQL语句中信息分别标记到字段信息上,最后对字段信息进行正解性验证
bool ParseCreateTable(vector<struct FieldNode> &pFieldList,vector<string> &pCommandField)
{
//检查表名是否合法
if(!CheckRuleForString(pCommandField[2].c_str()))
{
printf("当前输入的表名不符合命名规则[table:%s]\n",pCommandField[2].c_str());
return false;
}
//检查格式是否正解(
if(QueryKeyType(pCommandField[3].c_str())!= LEFT_MARK)
{
printf("当前 ( 处有问题\n");
return false;
}
for(int iIndex = 4;iIndex < pCommandField.size();)
{
switch(QueryKeyType(pCommandField[iIndex].c_str()))
{
case CHECK_KEY:
iIndex = AnalysisCheck(pCommandField,iIndex,pFieldList);
if(iIndex == false)
{
printf("分析此字段失败\n");
return false;
}
break;
case PRIMARY_KEY:
break;
case COMMA_MARK:
iIndex++;
break;
case RIGHT_MARK:
if(++iIndex == pCommandField.size())
{
printf("分析结束\n");
return true;
}
else
{
printf("分析失败\n");
return false;
}
default:
iIndex = AnalysisField(pCommandField,iIndex,pFieldList);
if(iIndex == false)
{
printf("分析此字段失败\n");
return false;
}
break;
}
}
return true;
}
//将字段列表中设为主键,若不符合规则,则返回false
bool SetPrimaryField(vector<struct FieldNode> &pFieldList)
{
int iPrimaryCount = 0;
vector<FieldNode>::iterator pData;
for(pData = pFieldList.begin();pData!=pFieldList.end();pData++)
{
if(pData->bIsPrimaryKey)
iPrimaryCount++;
}
if(iPrimaryCount == 0)
{
pFieldList[0].bIsPrimaryKey = true;
return true;
}
else if(iPrimaryCount > 1)
return false;
return false;
}
//进行安全性检查,要创建的表是否已经存在
//先创建表结点,写入tables.list中
//将字段列表写入字段文件中
//创建另外两个文件
bool ExecCreateTable(const char *pStrTableName,vector<struct FieldNode> &pFieldList)
{
if(!SetPrimaryField(pFieldList))
{
printf("有太多的主键值\n");
return false;
}
if(IsTableExist(pStrTableName))
{
printf("要创建的表重名\n");
return false;
}
TableNode tableNode;
strcpy(tableNode.strTableName,pStrTableName);
strcpy(tableNode.strAuthor,g_strUserName);
SetTime(tableNode.lCreatTime,tableNode.strCreateTime);
if(!WriteTableInfor(tableNode))
{
printf("添加表结点失败\n");
return false;
}
char strFileName[2048] = "data\\";
strcat(strFileName,g_strCurrentDBName);
strcat(strFileName,"\\");
strcat(strFileName,pStrTableName);
FILE *fltd,*flid,*flst;//分别表示数据文件,索引文件与结构文件
char *filename1 = (char *)malloc(strlen(strFileName)+4);
char *filename2 = (char *)malloc(strlen(strFileName)+4);
char *filename3 = (char *)malloc(strlen(strFileName)+4);
strcpy(filename1,strFileName);
strcat(filename1,".lst");
strcpy(filename2,strFileName);
strcat(filename2,".lid");
strcpy(filename3,strFileName);
strcat(filename3,".ltd");
if((flst=fopen(filename1,"ab+"))==NULL)
{
printf("创建结构文件失败\n");
return false;
}
vector<FieldNode>::iterator Datalist;
for(Datalist = pFieldList.begin();Datalist!=pFieldList.end();Datalist++)
{
fwrite(Datalist,sizeof(FieldNode),1,flst);
}
fclose(flst);
if((flid=fopen(filename2,"ab+"))==NULL)
{
printf("创建索引文件失败\n");
return false;
}
fclose(flid);
if((fltd=fopen(filename3,"ab+"))==NULL)
{
printf("创建数据文件失败........\n");
return false;
}
fclose(fltd);
return true;
}
//--------------------------记录API-------------------
//读取指定文件名的字段信息
void ReadFiledListStruct(vector<struct FieldNode> &pFieldList,const char *pStrTableName)
{
if(pStrTableName == NULL)
{
printf("当前要操作的表为空\n");
return ;
}
char strFileName[2048] = "data\\";
strcat(strFileName,g_strCurrentDBName);
strcat(strFileName,"\\");
strcat(strFileName,pStrTableName);
strcat(strFileName,".lst");
FILE *fp;
if((fp=fopen(strFileName,"rb"))==NULL)
{
return ;
}
int iCount = 1;
FieldNode fieldNode;
while(!feof(fp))
{
if(fread(&fieldNode,sizeof(FieldNode),1,fp))
{
pFieldList.push_back(fieldNode);
}
iCount++;
}
fclose(fp);
}
//分析要插入的列表的值
int AnalysisInsertRecordValue(vector<string> &pCommandField,int iIndex,vector<string> &pValueList)
{
if(iIndex+1 >= pCommandField.size())
{
printf("%s\n",COMMANDLENGTHISNOTENOUGH);
return false;
}
if(strcmp(pCommandField[++iIndex].c_str(),"(") != 0)
{
printf("values后面需要一个 ( 号");
return false;
}
if(iIndex+1 >= pCommandField.size())
{
printf("%s\n",COMMANDLENGTHISNOTENOUGH);
return false;
}
pValueList.push_back(pCommandField[++iIndex]);
while(true)
{
if(iIndex+1 >= pCommandField.size())
{
printf("%s\n",COMMANDLENGTHISNOTENOUGH);
return false;
}
switch(QueryKeyType(pCommandField[++iIndex].c_str()))
{
case COMMA_MARK:
if(iIndex+1 >= pCommandField.size())
{
printf("%s\n",COMMANDLENGTHISNOTENOUGH);
return false;
}
pValueList.push_back(pCommandField[++iIndex]);
break;
case RIGHT_MARK:
printf("字段值表分析完毕\n");
iIndex++;
return iIndex;
default:
printf("当前出现不能识别的字符串[%s]\n",pCommandField[iIndex].c_str());
return false;
}
}
return false;
}
//分析要插入的字段列表信息
int AnalysisInsertSet(vector<string> &pCommandField,int iIndex,vector<string> &pFieldList)
{
if(iIndex+1 >= pCommandField.size())
{
printf("%s\n",COMMANDLENGTHISNOTENOUGH);
return false;
}
if(!CheckRuleForString(pCommandField[++iIndex].c_str()))
{
printf("当前字段输入不符合命名规则[%s]\n",pCommandField[iIndex].c_str());
return false;
}
pFieldList.push_back(pCommandField[iIndex]);
while(true)
{
if(iIndex+1 >= pCommandField.size())
{
printf("%s\n",COMMANDLENGTHISNOTENOUGH);
return false;
}
switch(QueryKeyType(pCommandField[++iIndex].c_str()))
{
case COMMA_MARK:
if(iIndex+1 >= pCommandField.size())
{
printf("%s\n",COMMANDLENGTHISNOTENOUGH);
return false;
}
if(!CheckRuleForString(pCommandField[++iIndex].c_str()))
{
printf("当前字段输入不符合命名规则[%s]\n",pCommandField[iIndex].c_str());
return false;
}
pFieldList.push_back(pCommandField[iIndex]);
break;
case RIGHT_MARK:
printf("字段列表分析完毕\n");
iIndex++;
return iIndex;
default:
printf("当前出现不能识别的字符串[%s]\n",pCommandField[iIndex].c_str());
return false;
}
}
return false;
}
//预处理SQL Insert Into 命令,生成两个结构体
bool ParseInsertRecord(vector<string> &pCommandField,vector<string> &pFieldList,vector<string> &pValueList)
{
if(!CheckRuleForString(pCommandField[2].c_str()))
{
printf("当前输入的表名不符合命名规则[table:%s]\n",pCommandField[2].c_str());
return false;
}
int iIndex = 3;
for(int i = 0; i < 2; i++)
{
switch(QueryKeyType(pCommandField[iIndex].c_str()))
{
case LEFT_MARK:
iIndex = AnalysisInsertSet(pCommandField,iIndex,pFieldList);
if(iIndex == false)
{
return false;
}
break;
case VALUE_KEY:
iIndex = AnalysisInsertRecordValue(pCommandField,iIndex,pValueList);
if(iIndex == false)
{
return false;
}
printf("走到这一步了\n");
if(iIndex == pCommandField.size())
{
printf("走到这一步了\n");
return true;
}
break;
default:
printf("当前有不能识别出来的字符串[%s]\n",pCommandField[iIndex].c_str());
return false;
}
}
return false;
}
//检查要插入的文本类型是否合法
bool CheckRuleForInsertTextType(string &strValue,string &pStr)
{
if(pStr.length() < 3)
{
return false;
}
const char *pIndex = pStr.c_str();
if( ( pIndex[0] == '\'' && pIndex[pStr.size()-1] == '\'' )
|| ( pIndex[0] == '\"' && pIndex[pStr.size()-1] == '\"' ) )
{
for(int i = 1; i < pStr.length() -1; i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -