⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 common.cpp

📁 DBMS(Database Management System)在当前的信息系统开发中处于主导位置
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		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 + -